Hello! I'd like to get fog working in conjunction with pixel shaders 2.0 or earlier. The problem is that said shaders don't replace the fog stage in Direct3D. Adding the necessary fog calculations to a GLSL fragment shader is trivial, however, this results in a dependency of the shader on the current fog state.
Now, I have thought up three solutions for this problem:
1) Compile two versions of every fragment shader (one with fog and one without) and choose the appropriate one according to the state. Pro: Probably performance wise the cheapest solution Con: Generates more shaders, however, as shader are only compiled on demand, this shouldn't be too bad.
2) Rebuild the shader whenever it is bound in conjunction with a changed fog state. Pro: ? Con: This would be a performance killer as it would potentially cause multiple calls of IWineD3DPixelShaderImpl_CompileShader per frame, as some Programs use the same fragment shader for rendering with and without fog. (ok, I only know this of source based games, but imo that's bad enough)
3) Add Fog calculation to every shader, enabling or disabling it at runtime via a constant factor of 1.0 or 0.0 depending on the fog state which is supplied as a shader constant. Pro: cpu-load wise cheap Con: Adds some more instructions to fragment shader code.
Now, I don't particularly like any of these solutions, so I'd welcome other ideas, comments or suggestions.
Fabian
P.S: I noticed that fog-state management is not yet included in the state table. Should a patch that fixes fog with pixel shaders wait until this is done, or is this of no importance?