pass3和pass2类似,只是再熟悉下,这个Pass设定为最后一步,可以不再输出纹理,
即
1,pass3摄像机输入tex2
osg::ref_ptr<osg::StateSet> stateset = pass3Camera->getOrCreateStateSet();
{
stateset->setTextureAttributeAndModes(0, tex2);
}
2,shader将背景从绿色变为蓝色
static const char* psShader3 =
{
“varying vec2 outTexCoord;”
“uniform sampler2D tex1;”
“void main(void)\n”
“{\n”
“gl_FragColor = texture2D(tex1,outTexCoord);”
“if(gl_FragColor.xyz == vec3(0.0,1.0,0))”
“{”
“gl_FragColor = vec4(0.0,0.0,1.0,1.0);”
"}"
"}\n"
};
3,pass3Root按顺序加上以前的所有摄像机,查看Pass3Root
osg::ref_ptr<osg::Group> pass3Root = new osg::Group();
pass3Root->addChild(sampleCamera0); //将摄像机加入场景
pass3Root->addChild(pass1Camera); //将摄像机加入场景
pass3Root->addChild(pass2Camera); //将摄像机加入场景
pass3Root->addChild(pass3Camera);
viewer->setSceneData(pass3Root);
运行结果

说明是正确的。完整代码如下:
#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/CoordinateSystemNode>
#include <osg/Switch>
#include <osg/Types>
#include <osgText/Text>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgGA/SphericalManipulator>
#include <osgGA/Device>
#include <osg/Shader>
#include <osg/Geometry>
#include <osg/Array>
#include <osg/primitiveset>
#include<osg/Geode>
osg::ref_ptrosg::Texture2D createFlo

该代码示例展示了如何在OpenGL中使用多个Pass进行渲染。首先创建纹理,然后设置摄像机和状态集,使用Shader改变背景颜色。在Pass3中,不再输出纹理,而是根据条件改变颜色。最终将所有摄像机添加到场景中,形成一个完整的渲染流程。
最低0.47元/天 解锁文章
449

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



