Hi

>>>>  environment->set(cubemap.get());

should be

>>>> environment->set(int(unit));

Cheers

27.03.2013, 18:45, "Andrea Martini" <martini.and...@gmail.com>:
> Hi,
> i'm trying to apply a reflection effect on a sphere, using a cube map.
> I'm using as vertex shader dthe following :
>
> Code:
>
> #version 400 compatibility
> // Orange Book Opengl Shading Language, 2 edition  pag. 257
>
> varying vec3  ReflectDir;
> varying float LightIntensity;
> uniform vec3  LightPos;
>
> void main()
> {
>     gl_Position    = ftransform();
>     vec3 normal    = normalize(gl_NormalMatrix * gl_Normal);
>     vec4 pos       = gl_ModelViewMatrix * gl_Vertex;
>     vec3 eyeDir    = pos.xyz;
>     ReflectDir     = reflect(eyeDir, normal);
>     LightIntensity = max(dot(normalize(LightPos - eyeDir), normal),0.0);
> }
>
> and the following fragment:
>
> Code:
>
> #version 400 compatibility
> // Orange Book Opengl Shading Language, 2 edition pag. 257
>
> uniform vec3  BaseColor;
> uniform float MixRatio;
>
> uniform samplerCube EnvMap;
>
> varying vec3  ReflectDir;
> varying float LightIntensity;
>
> void main()
> {
>     // Look up environment map value in cube map
>
>     vec3 envColor = vec3(textureCube(EnvMap, ReflectDir));
>
>     // Add lighting to base color and mix
>
>     vec3 base = LightIntensity * BaseColor;
>     envColor  = mix(envColor, base, MixRatio);
>
>     gl_FragColor = vec4(envColor, 1.0);
> }
>
> To pass the samplerCube, i use the following osg code :
>
> Code:
>
>   osg::Shader* vertexShader = osgDB::readShaderFile(osg::Shader::VERTEX, 
> "\\shaders\\\shaders\\ReflectionCubeMaps\\ReflectionCubeMaps4.vert");
>         osg::Program* program=new osg::Program();
>         if (!vertexShader)
>         {
>                 std::cout << " No vertex Shader Loaded." << std::endl;
>                 return;
>         }
>         osg::Shader* fragShader = 
> osgDB::readShaderFile(osg::Shader::FRAGMENT, 
> "\\shaders\\\shaders\\ReflectionCubeMaps\\ReflectionCubeMaps4.frag");
>         if (!fragShader)
>         {
>                 std::cout << " No fragment Shader Loaded." << std::endl;
>                 return;
>         }
>         program->addShader(vertexShader);
>         program->addShader(fragShader);
>         osg::StateSet* stateset=myModel->getOrCreateStateSet();  // My model 
> is the SPHERE
>
>         osg::ref_ptr<osg::TextureCubeMap> cubemap = new osg::TextureCubeMap;
>
>    /**/
>
>         osg::Image* imagePosX = 
> osgDB::readImageFile("\\Cubemap_snow\\posx.jpg");
>     osg::Image* imageNegX = osgDB::readImageFile("\\Cubemap_snow\\negx.jpg");
>     osg::Image* imagePosY = osgDB::readImageFile("\\Cubemap_snow\\posy.jpg");
>     osg::Image* imageNegY = osgDB::readImageFile("\\Cubemap_snow\\negy.jpg");
>     osg::Image* imagePosZ = osgDB::readImageFile("\\Cubemap_snow\\posz.jpg");
>     osg::Image* imageNegZ = osgDB::readImageFile("\\Cubemap_snow\\negz.jpg");
>
>     if (imagePosX && imageNegX && imagePosY && imageNegY && imagePosZ && 
> imageNegZ)
>     {
>         cubemap->setImage(osg::TextureCubeMap::POSITIVE_X, imagePosX);
>         cubemap->setImage(osg::TextureCubeMap::NEGATIVE_X, imageNegX);
>         cubemap->setImage(osg::TextureCubeMap::POSITIVE_Y, imagePosY);
>         cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Y, imageNegY);
>         cubemap->setImage(osg::TextureCubeMap::POSITIVE_Z, imagePosZ);
>         cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Z, imageNegZ);
>
>         cubemap->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
>         cubemap->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
>         cubemap->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);
>
>         cubemap->setFilter(osg::Texture::MIN_FILTER, 
> osg::Texture::LINEAR_MIPMAP_LINEAR);
>         cubemap->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
>
>                 cubemap->setResizeNonPowerOfTwoHint( false );
>     }
>
>         stateset->setAttributeAndModes( program, osg::StateAttribute::ON );
>         stateset->setTextureAttributeAndModes( unit, cubemap.get() );
>
>         osg::Uniform* environment = new 
> osg::Uniform(osg::Uniform::SAMPLER_CUBE, "EnvMap");
>     environment->set(cubemap.get());
>     stateset->addUniform( environment );
>         stateset->addUniform(new osg::Uniform("LightPos",osg::Vec3(0.0, 0.0, 
> 4.0)));
>         stateset->addUniform(new osg::Uniform("BaseColor",osg::Vec3(0.8, 0.2, 
> 1.0)));
>         stateset->addUniform(new osg::Uniform("MixRatio",0.8f));
>
> What i get, is the cubemap and a violet sphere : the sphere doesn't reflect 
> the environment.
>
> In the file attached, i report a snapshot of the result.
>
> Please, could you suggest me where i can find the error?
>
> Thank you!
>
> Cheers,
> Andrea
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=53341#53341
>
> ,
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to