查看: 1903|回复: 15

这是什么情况啊????求解!

[复制链接]

该用户从未签到

发表于 2012-9-25 12:39:26 | 显示全部楼层 |阅读模式
  
求教下!我做的模板测试!飞机在地形下面!在有树的地方怎么会无效啊?我使用的是lz.osg和cessna.osg

模板测试 有树无效

模板测试 有树无效

模板测试

模板测试


代码:
osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("lz.osg");
node1->setName("first");

osg::ref_ptr<osg::Node> node2 = osgDB::readNodeFile("cessna.osg");
node2->setName("second");

osg::ref_ptr<osg::Stencil> stencil2 = new osg::Stencil();
stencil2->setFunction(osg::Stencil::ALWAYS,2,0xFF);
stencil2->setOperation(osg::Stencil::ZERO,osg::Stencil::REPLACE,osg::Stencil::REPLACE);
osg::ref_ptr<osg::StateSet> stateset2 = new osg::StateSet();
stateset2->setAttributeAndModes(stencil2.get(),osg::StateAttribute::ON);
node2->setStateSet(stateset2.get());

osg::ref_ptr<osg::Stencil> stencil3 = new osg::Stencil();
stencil3->setFunction(osg::Stencil::EQUAL,0,0xFF);
stencil3->setOperation(osg::Stencil::REPLACE,osg::Stencil::KEEP,osg::Stencil::KEEP);
osg::ref_ptr<osg::StateSet> stateset3 = new osg::StateSet();
stateset3->setAttributeAndModes(stencil3.get(),osg::StateAttribute::ON);
node1->setStateSet(stateset3.get());

该用户从未签到

 楼主| 发表于 2012-9-25 16:45:51 | 显示全部楼层
没人找到嘛?求教啊!

该用户从未签到

 楼主| 发表于 2012-9-27 09:25:14 | 显示全部楼层
什么情况啊!求教啊!没人知道吗?

该用户从未签到

 楼主| 发表于 2012-9-27 09:25:18 | 显示全部楼层
什么情况啊!求教啊!没人知道吗?

该用户从未签到

 楼主| 发表于 2012-9-27 09:25:24 | 显示全部楼层
什么情况啊!求教啊!没人知道吗?

该用户从未签到

 楼主| 发表于 2012-9-27 09:25:33 | 显示全部楼层
什么情况啊!求教啊!没人知道吗?

该用户从未签到

 楼主| 发表于 2012-9-27 09:25:43 | 显示全部楼层
什么情况啊!求教啊!没人知道吗?

该用户从未签到

 楼主| 发表于 2012-9-27 09:25:48 | 显示全部楼层
什么情况啊!求教啊!没人知道吗?

该用户从未签到

发表于 2012-9-27 09:34:25 | 显示全部楼层
树是需要进行深度排序来保证背景透明的正确性的,因此它的渲染次序在所有的不透明体之后

该用户从未签到

 楼主| 发表于 2012-9-27 14:09:01 | 显示全部楼层
array 发表于 2012-9-27 09:34
树是需要进行深度排序来保证背景透明的正确性的,因此它的渲染次序在所有的不透明体之后

谢谢array老师!
我发现貌似是这些树绘制的太晚了!在地图的模板测试改变了所有模板值之后才绘制的,然后根据条件就能绘制上去!

还有就是怎么进行深度排序呢?没接触过,只是看到有几种方法但是不知道具体该怎么办!

该用户从未签到

发表于 2012-9-27 14:19:47 | 显示全部楼层
OSG自己已经完成深度排序了,设置TRANSPARENT_BIN即可

该用户从未签到

 楼主| 发表于 2012-9-27 14:34:12 | 显示全部楼层
array 发表于 2012-9-27 14:19
OSG自己已经完成深度排序了,设置TRANSPARENT_BIN即可

能说一下OSG的深度排序具体实现嘛?或者在那个代码区!我想看看原理!非常感谢!

该用户从未签到

 楼主| 发表于 2012-9-27 15:00:47 | 显示全部楼层
array 发表于 2012-9-27 14:19
OSG自己已经完成深度排序了,设置TRANSPARENT_BIN即可

设置了TRANSPARENT_BIN,但是没效果!
osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("Testlz.osg");
node1->setName("first");

osg::ref_ptr<osg::Stencil> stencil3 = new osg::Stencil();
stencil3->setFunction(osg::Stencil::EQUAL,0,0xFF);
stencil3->setOperation(osg::Stencil::REPLACE,osg::Stencil::KEEP,osg::Stencil::KEEP);
osg::ref_ptr<osg::StateSet> stateset3 = node1->getOrCreateStateSet();
stateset3->setAttributeAndModes(stencil3.get(),osg::StateAttribute::ON);
stateset3->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
stateset3->setRenderBinMode(osg::StateSet::INHERIT_RENDERBIN_DETAILS);
是这样设置吗?

该用户从未签到

 楼主| 发表于 2012-9-27 17:05:38 | 显示全部楼层
array 发表于 2012-9-27 14:19
OSG自己已经完成深度排序了,设置TRANSPARENT_BIN即可

是单独对树进行深度排序吗?我现在是对整个lz.osg文件类容全部使用了TRANSPARENT_BIN,但是没有效果!

该用户从未签到

发表于 2012-10-8 09:46:03 | 显示全部楼层
大部分教程书籍中都有对于TRANSPARENT_BIN的介绍。对于整个文件设置是没有用的。对于每个需要透明的对象单独设置才可以。例如场景中有10000棵树的话,需要分别设置TRANSPARENT_BIN才能让它们的互相遮挡融合关系正确;此外对于设置了透明的节点内部,如果存在自交叉的话也是无法正确融合的——这都是OpenGL经典透明排序的理论,如果不能满足您的要求,那么就要考虑一些基于shader的高级方法例如depth peeling了
深度排序的相关代码在RenderStage.cpp中,不是非常容易阅读,《最长的一帧》应该可以帮助您更快地定位。

该用户从未签到

 楼主| 发表于 2012-10-8 12:12:46 | 显示全部楼层
array 发表于 2012-10-8 09:46
大部分教程书籍中都有对于TRANSPARENT_BIN的介绍。对于整个文件设置是没有用的。对于每个需要透明的对象单独 ...

谢谢您的讲解!我编写了个节点遍历程序修改lz.osg的所有节点属性!设置了TRANSPARENT_BIN
ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
但是还是不行,哎!只有看看其他办法了!
这个树。。。。如果我使用模板测试的时候从5递减到0,绘制lz.osg的时候要模板值等于0才绘制,这样树就不会遮挡住飞机!但是。。。这样做当改变观察位置的时候,由于模板值在递减中,所以屏幕有一部分会出现什么都没绘制,要过一会儿才会把地响绘制上去!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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