查看: 2587|回复: 5

求助LOD下的多重纹理映射

[复制链接]

该用户从未签到

发表于 2009-1-18 01:34:16 | 显示全部楼层 |阅读模式
问题是这样的:
有一个带纹理的地形,我想在地形上动态覆盖另一种纹理(纹理坐标需要实时计算),覆盖的方式(由于不能采用shader)是使用texgen来自动生成纹理坐标(我使用的是OBJECT_LINEAR)。当地形是一个geode时没有任何问题。现在地形用了一个多层的LOD,请问想要达到这样的效果,我应该怎么做

我现在的做法是从顶层LOD开始为每一层的每个子LOD设置updatecallback,并将该LOD的中心坐标传进去,updatecallback里根据这个中心坐标更改texgen的S、R、T平面参数,使得OBJECT_LINEAR的变换针对的不再是LOD的内部坐标而是全局坐标。但是结果不理想,只有在某些视距区间,显示的结果是正确的。因此这里向大家请教了

该用户从未签到

发表于 2009-1-18 15:05:33 | 显示全部楼层
您的做法我想是可以的,结果不理想也许是计算方法等方面的原因。也可以直接把TexGen和Texture2D都赋给LOD节点本身,然后在其Callback里面根据getRangeList()的结果设置纹理坐标参数。

该用户从未签到

 楼主| 发表于 2009-1-18 23:14:35 | 显示全部楼层
晚饭回来,问题解决了

之前结果不理想主要在两方面,一是某些视距下覆盖的纹理是错的,二是在恰当的视距下,当地形是用多个LOD拼接时,动态覆盖的纹理尽管大体上是正确的,但在某个摄像机的显示下在拼接的地方存在一定的错位现象。

第一个问题是由于我只为LOD节点设置了updatecallback,后来发现最底层的LOD是一些matrixtransform,这些matrixtransform直接作为了group的子节点,而没有再给它们分配LOD节点。因此我原来的做法跳过了最底层的LOD地形数据。当视距足够小的时候自然就无法正确覆盖动态纹理了。

第二个问题后来发现是因为视距太大了。。因为出问题的那个摄像机采用的是2D的正投影(鹰眼视角),为了防止地形高度高过摄像机,就把摄像机的高度设得很高,以为反正正投影不受距离影响。其实之前在场景中画线的时候,已经发现观察距离过大会导致线条变形,把距离改小过(值和地形宽长差不多),没想到这次又中招。

还没找到造成第二个问题的原因,个人猜测是因为我是利用LOD的center来计算顶点的全局坐标,而osg中这个变量的精度比较低(float型,不知道为什么osg把boundingsphere的valuetype设成了float),这样同一层不同的LOD中计算的全局坐标就出现差异了。只是猜测,大家能不能帮我分析下。

多谢array了,可惜看到的晚了点,要不然可以少走一阵弯路:)

[ 本帖最后由 leon 于 2009-1-18 23:15 编辑 ]

该用户从未签到

发表于 2009-1-18 23:18:49 | 显示全部楼层
BoundingSphere的valuetype是可以改的,在CMake编译的时候,将高级选项里面的OSG_USE_FLOAT_BOUNDINGSPHERE设置为OFF,其它的几个选项也可以以此类推,以增大内存占用量为代价,提升变量的精度

该用户从未签到

 楼主| 发表于 2009-1-18 23:21:20 | 显示全部楼层
要是LOD的center能单独用一种精度就好了,毕竟地形数据的有效位比一般模型来的多

该用户从未签到

发表于 2009-1-18 23:29:30 | 显示全部楼层
您可以向osg-users提出您的意见,作为这方面的从业者,您的感受和建议会比其他人更加有分量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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