查看: 3381|回复: 20

两个模型挨着,为什么在转动的时候会闪

[复制链接]

该用户从未签到

发表于 2008-12-23 10:11:13 | 显示全部楼层 |阅读模式
我有2个模型,其中有一个面是挨着的,没有一点缝隙,为什么在转动的时候会闪,有时候显示这个模型的一部分 有时候显示那个模型的一部分呢

该用户从未签到

发表于 2008-12-23 11:19:39 | 显示全部楼层
面重合了吧,用多边形 偏移据说可以解决,我也有这个问题,采用多边形偏移有些解决不了,没找原因,干脆建模时,将不同的类进行不同的偏移,尽量减少重合的几率,也就好了,当然要依赖于你的工作模型,我主要处理建筑,通过不同类识别能解决这个问题,你可以试下多边形偏移。

该用户从未签到

发表于 2008-12-23 11:21:39 | 显示全部楼层
恩,,重合的面太多了~~~~~~最好的方法就是在建模的时候处理~~~~~~

该用户从未签到

 楼主| 发表于 2008-12-23 11:35:23 | 显示全部楼层
那个本来就是需要重合的 我试过 偏移一点是能解决问题 但是那两个不能便偏移 必须是重合的 我不知道有没有不偏移解决这个问题的办法

该用户从未签到

 楼主| 发表于 2008-12-23 11:41:25 | 显示全部楼层
还有我想问问 flysky版主 你的地形上叠加矢量 不是2个模型是完全挨着的吗?还是那个矢量不和地形挨着 中间有一定的距离呢?

该用户从未签到

发表于 2008-12-23 13:37:05 | 显示全部楼层
面重合肯定是会出现Z-Fighting的,用PolygonOffset是比较标准的方法。可以参看下glPolygonOffset的相关知识,不一定是让您在建模的时候改变顶点位置,而是设置OpenGL渲染时重合面的显示有个上下偏置。

该用户从未签到

 楼主| 发表于 2008-12-23 15:27:43 | 显示全部楼层
我设置两个node的ode->getOrCreateStateSet()->setAttributeAndModes(
        new osg:olygonOffset( 1.0, 1.0 ),
        osg::StateAttribute::ON );
但是没有效果 不知道我到底是那里有问题啊 版主班忙再看看

该用户从未签到

 楼主| 发表于 2008-12-23 15:34:17 | 显示全部楼层
对了 我其中的一个node是线 不是面 是不是这样一个面一个线的情况 polygonoffset就不起作用了呢?

该用户从未签到

发表于 2008-12-23 15:47:02 | 显示全部楼层
设置其中一个Node的StateSet就可以了

该用户从未签到

 楼主| 发表于 2008-12-23 15:55:02 | 显示全部楼层
设置一个我也试了 也是没效果 还有其他学要注意的地方吗?

该用户从未签到

发表于 2008-12-24 08:45:03 | 显示全部楼层
两个都设置一样值等于没有设置
关注下,我发现的问题是有的面有作用,有的没有,因为我做建筑好多这种重合面,客户在建模时是肯定要重合的,好定位,我也很疑惑,希望能得到正解
如果仅仅是两个模型重合面,设置一个应该没问题的

该用户从未签到

发表于 2008-12-24 09:02:40 | 显示全部楼层
我没太关注过PolygonOffset这个类,有可能它当初设计的时候没有考虑全面。建议您把根节点设置一个值全为0.0的PolygonOffset,而重合且需要偏置的模型则设置为一个适当的非零值,再试一下。

该用户从未签到

 楼主| 发表于 2008-12-24 09:38:04 | 显示全部楼层
按照array版主说的那样做了, 但是还是没有效果。好像PolygonOffset这个类这个类就没有起作用。这个和opengl的版本有关吗?

该用户从未签到

发表于 2008-12-24 10:04:06 | 显示全部楼层
基本上现在的显卡应该都可以

该用户从未签到

发表于 2008-12-24 16:01:40 | 显示全部楼层
楼主这个问题如果能解决,请贴出代码,俺也学习下,谢谢

该用户从未签到

 楼主| 发表于 2008-12-25 09:56:25 | 显示全部楼层
仔细看了看 以为PolygonOffset做了什么深奥的东西呢,其实他就是把2个面给强制分开了,当把参数设置很大的时候能明显看出2个面之间的缝隙,之所有还有有斑驳的现象 我觉得那只能说明 参数设置的还是小,不知道我理解的对不对??

该用户从未签到

发表于 2008-12-25 11:00:53 | 显示全部楼层
确实不是什么深奥的东西,glPolygonOffset本身就是这个原理的,如果我们有朝一日可以随心所欲地干预OpenGL流水线的话,那么这些功能都可以被我们自己的代码替代,就像高级渲染技术大多摒弃掉glLight一样。

该用户从未签到

发表于 2008-12-26 17:14:11 | 显示全部楼层
期待中....我也碰到这个问题了

该用户从未签到

发表于 2008-12-26 18:07:35 | 显示全部楼层
原帖由 fengosg 于 2008-12-26 17:14 发表
期待中....我也碰到这个问题了


用PolygonOffset是可以的,楼主不是已经解决了吗,之前的参数设置的可能不合理。

该用户从未签到

发表于 2008-12-26 22:18:59 | 显示全部楼层
我的模型是在3dmax里面做出来的,在3dsmax里面都是闪的厉害的。。。更不知道应该怎么解决了。

该用户从未签到

发表于 2008-12-27 09:49:32 | 显示全部楼层
这就使大家常说的Z-Fighting现象,其原因就是OpenGL中的Z Buffer是有位数限制的(例如32位),因此在计算深度的时候不能精确区 分两个面的前后(离散化时,时而在前时而在后),因此就会闪烁了。
    一般来讲OpenGL用PolygonOffset进行解决,即强制确定两个面的绘制顺序,例如我们在地面上绘制矢量线,因为矢量线一定在地形的上面,我们的视点也肯定在地面上来看,但是如果两个物体不能确定顺序就难办了。
    如果不能确定前后,建议建立一个面,通过正面和背面不同来实现(这也应该是符合道理的)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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