Hi David,
I'm not able to use the BlendFunct you posted but it seems I can get something 
nice with the following (fragment) shader:

char myBlendingProgram[] =
"uniform float width;\n"
"uniform float height;\n"
"uniform sampler2D sceneTexture;\n"
"uniform sampler2D blendTexture;\n"
"void main(void) {\n"
"       vec2 texCoord = vec2(gl_FragCoord.x/width, gl_FragCoord.y/height);\n"
"       vec4 sceneColor = texture2D(sceneTexture, texCoord);\n"
"       vec4 blendingColor = texture2D(blendTexture, texCoord);\n"
"       gl_FragColor = sceneColor * blendingColor;\n"
"}\n";

Anyway I have some questions.

In your BlendFunct I don't know how you get the "inout vec4 color" parameter. I 
guess it's something like "sceneColor" in my shader. But I would like to know 
the proper way you suggest to get it.

Then,
just like the osgdistortion example, I have the following OSG node structure:


Code:
root (osg::Group)
+--- renderToTextureCamera (osg::Camera)
|      +--- (Scene)
+--- hudCamera(osg::Camera)
       +--- geode (osg::Geode)
              +--- geometry (osg::Geometry)



To the renderToTextureCamera I call:
camera->attach(osg::Camera::COLOR_BUFFER, texture);

While I attach the texture to the geometry with the code:
osg::StateSet* stateset = geometry->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute:: ON);
stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

And I attach the shader to the Geode node.

Is it correct to attach the shader to the geode?

Anyway, here is the code I use to attach the shader and related uniforms to the 
geode stateset:


Code:
void OsgPlugin::addShader(osg::Geode* node)
{
        osg::StateSet * stateset = node->getOrCreateStateSet();

        osg::Program * program = new osg::Program;
        stateset->setAttribute(program);
        program->addShader(new osg::Shader(osg::Shader::FRAGMENT, 
myBlendingProgram));

        stateset->addUniform(new osg::Uniform("width", (float)1280.0));
        stateset->addUniform(new osg::Uniform("height", (float)720.0));

        osg::ref_ptr< osg::Image> blendingImage = 
osgDB::readImageFile("C:/Users/User/Desktop/temp/blending.png");
        osg::Texture2D* texture = new osg::Texture2D(blendingImage.get());
        texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
        texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);

        stateset->setTextureAttribute(1, texture);
        stateset->addUniform(new osg::Uniform("blendTexture", 1));
}




One note: I have to use 1 as first parameter of setTextureAttribute to make my 
example working (with 0 it didn't work).
On the other hand I was surprised to have a valid sceneTexture in my shader 
without setting it on the stateset of the geode nor adding a uniform for it! 
Can you exaplain me why? I can suppose the TextureAttribute can be inherited 
from the stateset of the related geometry but I can't understand why the 
uniform is not needed.

Moreover, the "sceneTexture" variable I get in the shader is not distorted. In 
fact I used the same code of osgdistortion exampe for the moment where a sort 
of distortion is implemented on the geometry.
If I remove the shader I can correctly see the distortion. Can you explain me 
why please?

I have one more question (problem to solve) but I think that's enough for the 
moment.

Best regards,
Gianni

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





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to