Skip to content

List of Project Ideas for GSoC 2014

Esteban Tovagliari edited this page Feb 13, 2015 · 1 revision

We are participating to Google Summer of Code 2014!

This page lists a number of tasks we think would be appropriate as GSoC projects; however, feel free to come up with your own project if there's something that you would really like to work on but that isn't listed here.

If you are interested in applying to GSoC to work on appleseed, please follow our How to Apply guide.

You can also join me (Franz, project lead) directly by email at [email protected].

Core appleseed Development Projects

Easy Difficulty

Project 1: Implement several small features

Many important features are by themselves too small to constitute a Google Summer of Code project, however a project could be made out of implementing many of these smaller features, with the additional bonus of increased variety and easier to track progress.

Here are some tasks that would fit perfectly for this project:

  • Allow to define custom bokeh shapes using textures
  • Add support for texture transforms (allowing to translate/rotate/scale/mirror textures)
  • Implement local caching of asset files that may otherwise reside on file servers on the network
  • Add a "watch mode" to appleseed.studio that would let it reload the current project if it has changed on disk
  • Implement I/O plugins to support external image/mesh file formats (using Boost to load shared libraries)
  • Implement entity plugins to support external BSDF models, surface shaders models, etc. (again, using Boost)

Our issue tracker has a special GSoC label that makes it easy to find more small tasks suitable for this GSoC project: https://github.com/appleseedhq/appleseed/issues?labels=GSoC&state=open

We chose tasks that are small in scope, relatively self-contained, yet interesting and of high value to users.

  • Required Skills (depending on features): C++, Qt, Rendering
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban
  • Feature Specialist: Jonathan

Moderate Difficulty

Project 2: Design a procedural geometry API

appleseed is currently lacking a way to generate geometry at render-time. This ability is central to many other features to come: particle rendering, support for custom mesh formats via plugins, etc. This is one of the most highly anticipated feature.

This project will require to:

  • gather requirements from the different parties;
  • design, in cooperation with the involved parties, the actual C++ API to create polygonal meshes and to instantiate objects;
  • expose this API through appleseed's Python API;
  • extend the concept of assemblies to support procedurally-defined assemblies;
  • document the API using Doxygen;
  • and create example plugins.

The biggest difficulty is probably to extend the assembly system to support procedural-defined assemblies; however this need was anticipated from the start and the current design should support these changes without pain.

  • Required Skills: C++, API Design, Rendering
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban
  • Feature Specialists: Nicholas, Dorian

Project 3: Add a material editor in appleseed.studio

Creating materials in appleseed.studio is currently a tedious process as the users needs to create a myriad of small entities and connect them together. This tedious workflow is due to the fact that appleseed.studio let the user directly manipulates the internal entities that constitute a scene in appleseed; however these entities were never meant to be directly manipulated.

We need a single panel user interface to create and edit materials in appleseed.studio. Behind the hood this interface will automatically create, edit and connect the internal entities of the scene. The material editor should also feature a live preview of the material.

This project will require to:

  • create the Material Editor dialog using Qt Designer;
  • create the graph of appleseed entities to represent the material as configured in the editor;
  • configure the editor when editing an existing graph of appleseed entities;
  • create a small test scene (possibly just a sphere with a couple light sources) to use in the live preview;
  • integrate and wire the live preview into the editor;
  • if time allows, make a video demo of the new material editor.

Some references:

  • Required Skills: C++, Qt
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban

Project 4: Add support for OpenColorIO

OpenColorIO (OCIO) is an open source project from Sony Pictures Imageworks. Support for OCIO in appleseed.studio would allow the user to adjust gamma, exposure, and to transform colors of the rendered images using 3D LUT in real time.

This project will require to:

  • integrate the OpenColorIO library into appleseed;
  • make sure it builds properly on all supported platforms (64-bit Windows, Linux and OS X);
  • refactor the render widget to allow color transformations via OCIO;
  • add UI widgets to appleseed.studio to allow gamma and exposure adjustments of the rendered image;
  • optionally expose in appleseed.studio a way to load a 3D LUT and apply it to the rendered image.

More details can be found in this issue.

  • Required Skills: C++, Qt, OpenGL
  • Primary Mentor: Esteban
  • Secondary Mentor: Franz

Project 5: Add support for IES light profiles

IES light profiles describe the distribution of light in luminaires. This page has more information about IES light profiles. The specification for IES light profiles can be found on this page. Many IES profiles can be downloaded from this page.

This project will require to:

  • learn about IES profiles and understand the concepts involved;
  • determine what subset of the IES-NA specification needs to be supported;
  • investigate whether some libraries exist to parse IES files;
  • if no suitable library can be found, implement our own parsing code (IES profiles are text files with a mostly parsable structure);
  • add a new light type that implements sampling of IES profiles;
  • and create a few test scenes demonstrating the results.

There are no particular difficulties. The parsing code can be a bit hairy but there are many open source implementations that can be leveraged or peeked at in case of ambiguity. The sampling code is probably the most interesting part but it shouldn't be difficult.

  • Required Skills: C++, Rendering
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban

Hard Difficulty

Project 6: Add support for displacement

Displacement is a way to add details to a surface by refining it and displacing it based on a texture or a shader. Together with motion blur and programmable shading, displacement is one of the pillar of production rendering.

The idea behind this project is to implement displacement as a three-step procedure:

  1. Refine the input surface by splitting the triangles based on world space splitting criteria (i.e. we do not split the surface based on screen space criteria).
  2. Move the vertices of the refined surface based on the low-frequency components of the input texture or shader.
  3. Build a normal map to represent the high-frequency components of the input texture/shader.

Step 1 could optionally take into account the displacement texture/shader to find where splitting is necessary and where it would be redundant.

  • Required Skills: C++, Rendering, Maths
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban

Project 7: Add support for curve rendering

Curves are the geometric primitive behind many other features, the most important of which is hair/fur rendering. This is a vast subject: this project will only be a starting point.

This project will require to:

  • read the literature about analytical intersection of Bézier curves (and B-splines?);
  • if analytical intersection seems like a viable option, implement ray-curve intersection function;
  • implement a function to tessellate a curve into a series of segments;
  • write a ray-tessellated curve intersection function;
  • compare the performances of ray-analytical curve vs. ray-tessellated curve functions;
  • develop an acceleration structure for curves using our generic (S)(M)BVH code, and plug it into the ray-assembly intersection code;
  • adapt the renderer::ShadingPoint class to allow the representation of ray-curves intersection.

This would be a natural cutting point for this project. Possible extensions include:

  • add support for "caps" at the tip(s) of the curve;
  • add support for flat, ribbon-like curves;
  • add support for motion blurred curves;
  • implement a basic shading model such as the Marschner model;
  • develop test scenes designed to check correctness and track performance;
  • compare performances with Arnold.

Interesting Links:

The corresponding issue has additional details.

  • Required Skills: advanced C++, Rendering, Maths
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban

Project 8: Add support for the Ptex texture mapping system

See http://ptex.us/ for more details about Ptex. We also have an issue to track this feature.

  • Required Skills: C++, Rendering
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban

Very Hard Difficulty

Project 9: Implement the QBVH acceleration data structure

Ray tracing is currently the bottleneck for the majority of the scenes. Better ray tracing acceleration structures have the potential to significantly speed up rendering.

The QBVH acceleration data structure is a 4-ary Bounding Volume Hierarchy (BVH) designed for fast traversal using SIMD instructions. This paper describes the data structure in details.

We have an issue to track this feature.

  • Required Skills: Advanced C++, SSE Instructions, Rendering, Ray Tracing
  • Primary Mentor: Franz
  • Secondary Mentor: Esteban

Other Ideas

We have many other project ideas that aren't detailed yet. If you are interested in any of the following project, let us know on appleseed-dev and we'll give you plenty of additional details:

  • Support of subdivision surfaces via the integration of OpenSubDiv
  • Importer for Arnold scene files (.ass files)
  • Implement shutter efficiency / "shutter shapes"
  • Implement ray differentials, and select mip map level based on ray differentials
  • Support for particle rendering
Clone this wiki locally