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

文章介绍了在将qedl移植到osg过程中,如何通过多pass技术处理采样摄像机和显示摄像机。首先设置采样摄像机背景为黑色并采样颜色缓冲区,然后将采样纹理传递给后续pass。在pass1中,摄像机将黑色背景变为红色,并通过shader进行处理。最后,将所有组件组合成一个pass1的根节点,以便观察和理解每个pass的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般情况,一个采样摄像机和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);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值