It's been a while since I've updated my planet shader. One of the items on my list was to make the shader more modular so that I could cope with different "types" of planet or moon, without proliferating the number of techniques. This is particularly important now that I am using an extensibility model for adding or updating data.
The planetary shader currently deals with the following options:
- Color map
- Normal map
- Specular map
- Night map
- Cloud map
- Rings (with shadows on both the body and ring)
One approach to support multiple combinations of these options is to use seperate shader techniques. The number of combinations when picking r items from n options is defined by Equation 1.
Since I could use any number of these options, the number is given by Equation 2.
For 7 shader options, this therefore gives 127 shader techniques. Clearly this would not be viable, so I opted to use static shader branching. Since certain aspects of my rendering required Shader Model 3.0 anyway, this seemed a good approach, and resulted in acceptable performance.
Figures 1-7 below show individual shader options for color, specular mapping, normal mapping, night, atmosphere, and clouds, with a cumulative combination alongside.
Figures 7 and 8 below show individual shader options for color and rings with a cumulative combination alongside.