osgFBO(八)多Pass--1,pass1.处理采样摄像机

一般情况,一个采样摄像机和1个显示摄像机就足够了,但是,并非完全如此。最近将qedl移植到osg时,就出现了N个步骤。当然,可以把所有的步骤都糅合在最后一个显示摄像机处理,但是那样就会成了大杂烩,代码不优雅,且容易出错。

所以,这时候要考虑多pass,

即将采样后的摄像机,通过pass1,tex0->tex1,再通过pass2摄像机tex1->tex2…

这是个比较有趣的事情,因为可以无限扩展下去。

这里先用颜色占位,有助于看看每个passRoot是否正确。

这里决定一步步来。
一,pass1
1,设置采样摄像机背景为黑色,
sampleCamera0->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
2,采样摄像机对颜色缓冲区进行采样
osg::ref_ptrosg::Texture2D tex0 = createFloatRectangleTexture(texWidth, texHeight);
sampleCamera0->attach(osg::Camera::COLOR_BUFFER0, tex0); //关联采样贴图

3,采样摄像机输出纹理tex0,供pass1摄像机输入使用
osg::ref_ptrosg::StateSet stateset = pass1Camera->getOrCreateStateSet();
{
stateset->setTextureAttributeAndModes(0, tex0);
}

4,pass1摄像机输出处理后的纹理(即背景变红)tex1,供以后的pass2摄像机使用

pass1Camera->attach(osg::Camera::COLOR_BUFFER0, tex1);

5,pass1摄像机添加一个面片

		osg::ref_ptr<osg::Geode> panelGeode_pass1 = createTexturePanelGeode();
		pass1Camera->addChild(panelGeode_pass1);

6,pass1摄像机关联的面片要贴在屏幕上
pass1Camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
7,设置shader,(c++部分)

		//对场景进行处理
		osg::ref_ptr<osg::Shader> vs1 = new osg::Shader(osg::Shader::VERTEX, vertexShader);
		osg::ref_ptr<osg::Shader> ps1 = new osg::Shader(osg::Shader::FRAGMENT, psShader);
		osg::ref_ptr<osg::Program> program1 = new osg::Program;
		program1->addShader(vs1);
		program1->addShader(ps1);
		program1->addBindAttribLocation("texCoord", 1);
		osg::ref_ptr<osg::Uniform> tex0Uniform = new osg::Uniform("tex0", 0);
		stateset->addUniform(tex0Uniform);
		stateset->setAttribute(program1, osg::StateAttribute::ON);

8,pass1摄像机将黑色背景变为红色,(在shader里改变)

static const char* psShader =
{
“varying vec2 outTexCoord;”
“uniform sampler2D tex0;”
“void main(void)\n”
“{\n”
“gl_FragColor = texture2D(tex0,outTexCoord);”
“if(gl_FragColor.xyz == vec3(0,0,0))”
“{”
“gl_FragColor = vec4(1.0,0.0,0.0,1.0);”

"}"

"}\n"

};

9,设置一个Pass1的根,加上采样摄像机以及pass1摄像机,这样就可以查看这个pass做了哪些事。、

osg::ref_ptr<osg::Group> pass1Root = new osg::Group;
pass1Root->addChild(sampleCamera0);
pass1Root->addChild(pass1Camera);	
viewer->setSceneData(pass1Root);

运行可得
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/directx3d_beginner/article/details/129892773