Hi all,

I'm trying to replace the fixed function texgen for a given effect by a shader in order to remove the back projection problem. But I'm struggling a bit to even get the texgen to work with shaders (once that's done removing the back projection will be a cinch).

The original (fixed pipeline) code does:

  _texGen= new osg::TexGen;
  _texGen->setMode( osg::TexGen::OBJECT_LINEAR );

  osg::StateSet *ss = geode->getOrCreateStateSet();
  ss->setTextureMode(
    _textureUnit, GL_TEXTURE_GEN_S, osg::StateAttribute::ON );
  ss->setTextureMode(
    _textureUnit, GL_TEXTURE_GEN_T, osg::StateAttribute::ON );
  ss->setTextureMode(
    _textureUnit, GL_TEXTURE_GEN_R, osg::StateAttribute::ON );
  ss->setTextureMode(
    _textureUnit, GL_TEXTURE_GEN_Q, osg::StateAttribute::ON );
  ss->setTextureAttributeAndModes(
    _textureUnit, _texGen.get(), osg::StateAttribute::ON );

And then later, in the cull traversal, it does:

  _texGen->setPlanesFromMatrix( someMatrix );

This works well on the fixed pipeline. Now my first question when replacing this by shaders is: I understand I need to replace the calculation by shader code like this in the vertex shader:

  gl_TexCoord[1].s = dot(gl_Vertex, gl_ObjectPlaneS[1]);
  gl_TexCoord[1].t = dot(gl_Vertex, gl_ObjectPlaneT[1]);
  gl_TexCoord[1].p = dot(gl_Vertex, gl_ObjectPlaneR[1]);
  gl_TexCoord[1].q = dot(gl_Vertex, gl_ObjectPlaneQ[1]);

But does the setPlanesFromMatrix() fill in the gl_ObjectPlaneS/T/R/Q builtins, or should I remove the osg::TexGen stateAttribute completely and instead place that same matrix in some uniform and use that? i.e. in the cull traversal:

  geode->getOrCreateStateSet()->getOrCreateUniform(
    "texGen", osg::Uniform::FLOAT_MAT4)->set(matrix);

and then in my shader:

  uniform mat4 texGen;
  //... then in main()
  gl_TexCoord[1].s = dot(gl_Vertex, texGen[0]);
  gl_TexCoord[1].t = dot(gl_Vertex, texGen[1]);
  gl_TexCoord[1].p = dot(gl_Vertex, texGen[2]);
  gl_TexCoord[1].q = dot(gl_Vertex, texGen[3]);

What is better?

Next question, is there something special I need to do in the fragment shader to use these generated texture coordinates? Because I tried simply doing the obvious:

  vec4 col = texture2D( tex, gl_TexCoord[1].st );

and it doesn't work (I've tried using the vertex shader both ways above, and even without any vertex shader which should revert to fixed pipeline vertex stage...).

So I guess my second question is more important, why does the texturing with OBJECT_LINEAR texGen not work when I just replace the fragment shader and use the fixed function vertex processing? I would think that would isolate the mistake to only the fragment shader...

Do I need to do something else in the fragment shader? Maybe transform the generated texture coordinates somehow? What does the fixed pipeline do with generated texture coords?

Thanks in advance,

J-S
--
______________________________________________________
Jean-Sebastien Guay    jean-sebastien.g...@cm-labs.com
                               http://www.cm-labs.com/
                        http://whitestar02.webhop.org/
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to