查看: 3752|回复: 9

旧话重提,osg透明贴图问题(树叶)。

[复制链接]

该用户从未签到

发表于 2011-1-5 15:53:14 | 显示全部楼层 |阅读模式
本帖最后由 x-fi 于 2011-1-5 16:26 编辑

首先说明一下我是建模的。模型都是由osgexp导出的。前几个月我发了一个帖子,询问解决透明贴图边缘透空的问题。http://bbs.osgchina.org/archiver/tid-4022.html
当然array告诉我解决这个问题的根本办法是将每一个面都分成一个物体。确实是解决了。但是这就引发了一个很大的问题。osg Geode 节点翻了两番。严重的影响了速度。(如果使用模型树问题就更严重了)
我看到很多游戏引擎都没有这个问题(有些有,例如fifa11的引擎),叶子边缘非常完美。如图:
01_botany_01_new.jpg
这里的树木已经不是十字交叉面的树木,很多都是模型树(一般几百个面),不可能每个面一个Geode 去“完美解决”这个问题吧?这样Geode会多的惊人。(我测试过3000个左右的Geode已经开始导致帧率下降了)这样是不是游戏引擎中有什么算法搞定了?还是osg的算法有问题还是什么?

还有为什么透空现象只发生在边缘部分(我的贴图的alpha已经是只有全白和全黑两种颜色了,边缘没有半透明的),我实在不明白。我已经看了一下深度排序的资料。请各位大大认真指教一下。

补充:只要是同在一个物体(Geode),带透明贴图的面不相交也会出现这个问题(不同于十字交叉树)。下面两棵树是一个物体,不是两个(两个树成一个geode)。
sdddddddddf.jpg

该用户从未签到

 楼主| 发表于 2011-1-5 17:28:04 | 显示全部楼层
我在osg-users找到一段回复。

This is a classic problem. In real-time graphics to get correct
transparency the transparent geometry needs to be sorted back to front
and rendered after opaque geometry. However, to keep real-time, we
generally won't sort all the polygons individually, we'll approximate by
sorting on the Drawable level. This, in general, gives the correct
results, as long as no drawable intersects or is inside a transparent
one. You can see where I'm going with this.

Your box is around the other object, hence this object is inside the box
that you want to make transparent. So depending on your view point, the
box will be sorted before or after the other object, and you will get
artifacts. There are workarounds though, but they involve tradeoffs in
performance. In your case since it's just one box you might not notice
the difference.

You could render the translucent box in two passes, one for the back
faces, and one for the front faces. You'll need to turn depth test (or
is it depth writes, can't remember, look it up on the web) off for this
to work.

Or you could split the box into 6 drawables, each having one rectangle
in it. That way the sorting on the Drawable level would work correctly.

Or you could investigate more advanced techniques, such as depth peeling
and order-independent transparency. Where the first two options were
specific to your case (a box surrounding another object) this one is
general and will work for all transparent objects, but will probably be
more difficult to implement and might cost more in terms of performance.

You can search the web and the archives for more details, as this has
been discussed in the past. And there are examples in the OSG sources
that can help as well.

Hope this helps,

请问他所说的two passes是什么?如何实现?

该用户从未签到

发表于 2011-1-6 08:56:32 | 显示全部楼层
two passes是SpeedTree的做法,貌似是第一遍渲染获取深度信息,第二遍根据深度信息渲染数据。我个人没有尝试过这种做法

该用户从未签到

发表于 2011-1-7 14:27:13 | 显示全部楼层
就我看,有点类似于Alpha测试和Alpha混合的区别。
Alpha混合若用得成功,的确可以消除边缘问题,不过经常性的不是这样;
Alpha测试则很难避免边缘问题,缘于图片的Alpha通道没有那么准确;

该用户从未签到

发表于 2011-1-7 15:15:11 | 显示全部楼层
只能把文理的alpha通道处理的干净点吧

该用户从未签到

 楼主| 发表于 2011-1-7 17:39:45 | 显示全部楼层
只能把文理的alpha通道处理的干净点吧
tianxiao888 发表于 2011-1-7 15:15


和这个没关系,再干净也没用,我上面已经说明了,这个是排序的问题。

该用户从未签到

发表于 2011-1-8 11:21:28 | 显示全部楼层
和这个没关系,再干净也没用,我上面已经说明了,这个是排序的问题。
x-fi 发表于 2011-1-7 17:39



他说的是最简单的处理方式   不要使用blend  处理干净所有的alpha  开启depth

虽然边缘有些生硬  但是其他问题一扫而光

这也是一种取舍  而且最简单

该用户从未签到

 楼主| 发表于 2011-1-10 15:17:58 | 显示全部楼层
他说的是最简单的处理方式   不要使用blend  处理干净所有的alpha  开启depth

虽然边缘有些生硬  但是其他问题一扫而光

这也是一种取舍  而且最简单
阿威 发表于 2011-1-8 11:21


受教了,确实是一种简单有效的方法。

该用户从未签到

发表于 2012-3-5 16:05:09 | 显示全部楼层
x-fi,您好!能告诉您具体实现的步骤吗?
使用OSGExp插件导出的模型,在osgviewer下看,在某些视角,树的边缘出现了空洞的现象(出现osg默认的颜色背景,蓝色),而换别的角度看又是完好!在某个视角观看,总是能够看见某些树叶发生空洞的现象,非常影响视角效果!!
在某些视角树的边缘出现空洞.gif

该用户从未签到

发表于 2012-3-5 16:13:00 | 显示全部楼层
图上传后,背景颜色成了灰色。前面四五颗树是正常的,后面一大排的树,出现了蒙影,是有问题!
求高人指点!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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