查看: 2001|回复: 3

如何用着色器给一个立方体进行纹理渲染

[复制链接]

该用户从未签到

发表于 2014-8-5 23:37:45 | 显示全部楼层 |阅读模式
大家好,

我想实现一个简单的功能,就是用着色器来对一个立方体进行纹理渲染,但是最后渲染出来的立方体是黑色的。我试了很多办法都没法把纹理贴图渲染到立方体上。希望大家可以帮我看一下问题在哪里,感激不尽。

下面是我的代码:
cpp 文件:
        osg::ref_ptr<osg::Image> image = osgDB::readImageFile("Images/reflect.rgb");
        osg::ref_ptr<osg::Node> node = createNode(); //创建立方体

osg::StateSet* squareState = node->getOrCreateStateSet();
         osg:rogram* squareProgramObject = new osg::Program;
       osg::Shader* squareVertexObject = new osg::Shader( osg::Shader::VERTEX );
       osg::Shader* squareFragmentObject = new osg::Shader( osg::Shader::FRAGMENT );
       squareProgramObject->addShader( squareFragmentObject );
       squareProgramObject->addShader( squareVertexObject );
           squareVertexObject->loadShaderSourceFromFile( "shaders/cubeRender.vert");
           squareFragmentObject->loadShaderSourceFromFile("shaders/cubeRender.frag");
       squareState->setAttributeAndModes(squareProgramObject, osg::StateAttribute::ON);

           osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D();
        texture->setImage(image.get());
        texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::NEAREST_MIPMAP_NEAREST);
        texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture:INEAR);

        osg::Uniform* myTextureU = new osg::Uniform("myTexture",texture.get());
        squareState->addUniform(myTextureU);
       
         viewer->setSceneData(node.get());

vertex shader:

void main()
{
       
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
        gl_TexCoord[0] = gl_MultiTexCoord0;
}

fragment shader:
uniform sampler2D myTexture;

void main()
{
        vec4 color = texture2D(myTexture, gl_TexCoord[0].st);
        gl_FragColor = color;
}

该用户从未签到

发表于 2014-8-6 10:11:11 | 显示全部楼层
你是不是没有给出集合体的纹理坐标,另外你可以打断点试下,你loadShader的调用的时候,看加载成功没有

该用户从未签到

 楼主| 发表于 2014-8-6 15:37:33 | 显示全部楼层
ysw 发表于 2014-8-6 10:11
你是不是没有给出集合体的纹理坐标,另外你可以打断点试下,你loadShader的调用的时候,看加载成功没有

shader的加载应该是成功的,因为我可以用shader来给立方体着色。

必须要给出纹理坐标吗?
我也试过如下的设置,把坐标设置成repeat模式。如果不用着色器的话是可以实现纹理渲染的,但是用了着色器后立方体还是黑色的。

cubeState->setTextureMode(0, GL_TEXTURE_GEN_S, osg::StateAttribute::ON);
cubeState->setTextureMode(0, GL_TEXTURE_GEN_T, osg::StateAttribute::ON);
cubeState->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON);
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
texture->setWrap(osg::Texture::WRAP_R, osg::Texture::REPEAT);

该用户从未签到

发表于 2014-8-6 16:50:41 | 显示全部楼层
becky 发表于 2014-8-6 15:37
shader的加载应该是成功的,因为我可以用shader来给立方体着色。

必须要给出纹理坐标吗?

如果,你吧gl_FragColor=vec4(255.0,0.0,0.0,1.0);立方体显示红色没有问题的话。
那你再试试把立方体的光照给关闭了,看看能否显示出来。我写了代码测试下了,我这边能正常显示,你的着色器没有问题.
可以创建的时候只创建立方体的一个面,看看是什么效果。我看咱们程序的差别就是我只构建一个面,你构建了一个立方体,按理说也没有啥问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表