[osg-users] Shader composition with multiple function injection

Hartwig Wiesmann hartwig.wiesmann at skywind.eu
Sat May 12 14:59:45 PDT 2018


Hi,

I had a look at the shader composition example. The main shader looks like this:

Code:

#pragma import_defines ( LIGHTING, TEXTURE_2D, VERTEX_FUNC(v) )

#ifdef LIGHTING
// forward declare lighting computation, provided by lighting.vert shader
void directionalLight( int lightNum, vec3 normal, inout vec4 color );
#endif

#ifdef TEXTURE_2D
varying vec2 texcoord;
#endif

#ifdef VERTEX_FUNC
uniform float osg_SimulationTime;
#endif

varying vec4 basecolor;

void main(void)
{
    basecolor = gl_Color;

#ifdef LIGHTING
    directionalLight( 0, gl_Normal.xyz, basecolor);
#endif

#ifdef TEXTURE_2D
    // if we want texturing we need to pass on texture coords
    texcoord = gl_MultiTexCoord0.xy;
#endif

#ifdef VERTEX_FUNC
    gl_Position   = gl_ModelViewProjectionMatrix * VERTEX_FUNC(gl_Vertex);
#else
    gl_Position   = gl_ModelViewProjectionMatrix * gl_Vertex;
#endif

}




In the example code one directional light computation can be injected. What is the best solution if I like to inject 0 to N directional lights where N is runtime dependent?

I could do something like:

Code:

#ifdef LIGHTING0
    directionalLight( 0, gl_Normal.xyz, basecolor);
#endif
#ifdef LIGHTING1
    directionalLight( 1, gl_Normal.xyz, basecolor);
#endif
#ifdef LIGHTING2
    directionalLight( 2, gl_Normal.xyz, basecolor);
#endif
...




but this is not very elegant. Though I do not see any other possibility. Am I missing a better solution?

Thank you!

Cheers,
Hartwig

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=73625#73625







More information about the osg-users mailing list