在前边几节,纹理坐标数组是在生成geometry前指定的。
这里在shader里计算,
一,注释掉geometry中的纹理坐标
//osg::ref_ptr<osg::Vec2Array> texCoord = new osg::Vec2Array;
//texCoord->push_back(osg::Vec2(0.0, 0.0));
//texCoord->push_back(osg::Vec2(1.0, 0.0));
//texCoord->push_back(osg::Vec2(1.0, 1.0));
//texCoord->push_back(osg::Vec2(0.0, 1.0));
//geom->setTexCoordArray(0, texCoord);
二,由于位置坐标是[-1,1],纹理坐标是[0,1],所以可以在顶点着色器里凑个公式,以满足位置坐标和纹理坐标的关系。
"vec2 coord = sign(gl_Vertex.xy);"
"texCoord.x = coord.x * 0.5 + 0.5;"
"texCoord.y = coord.y * 0.5 + 0.5;"
三,由于纹理坐标是在顶点着色器中计算的,还要传递给片元着色器,所以要加上
“varying vec2 texCoord;”
四,在应用程序中,由于颜色缓冲区的纹理设置为第0个,所以对第0个纹理进行采样。在shader中传递0过去。(这里用N表示普适性)
stateset_panelGeode->setTextureAttributeAndModes(N, tex);
osg::ref_ptr<osg::Uniform> tex1 = new osg::Uniform("tex1", N);
stateset_panelGeode->addUniform(tex1);
"uniform sampler2D tex1;"
五,在片元着色器中采样,(这里只采

该文讲述了如何在OpenGL编程中,通过删除预先设定的纹理坐标,改为在顶点着色器内计算,并传递给片元着色器进行采样的过程。通过使用osg库,创建了纹理面板并应用了自定义的顶点和片元着色器,实现了从位置坐标到纹理坐标的转换。最终,通过在两个Camera之间处理场景,成功地在屏幕上显示了计算出的纹理坐标效果。
最低0.47元/天 解锁文章
4045

被折叠的 条评论
为什么被折叠?



