Sat*_*own 3 opengl 3d rendering culling
嘿伙计们,我正在渲染旧游戏中的旧几何体.他们的客户有一些算法,让他们可以看到附近的区域,但我没有这种能力所以我正在考虑剔除不必要的多边形.目前,我正在渲染整个区域中的每个多边形,无论我是否能够看到它,无论它是否在视觉范围内.显然这是完全没有效率的.我的问题:
我应该使用什么类型的剔除.我知道我可以剔除不在平截头体中的多边形,这将有助于减轻一些负荷,但我可以说,选择不渲染距离相机一定距离的多边形吗?这个叫什么?我也在某些地区使用雾.同样的问题.我可以想出一种方法,我可以剔除雾后面的一切,我看不到的区域.
谢谢:这项工作的截图正在进行中.有些人可能会认出它:)另外,忽略叶子的丑陋颜色.我没有考虑到alpha遮罩.
有两种不同的需要考虑:你只是想正确看待它,即隐藏表面去除?然后进行简单的深度测试就可以了.开销是,您处理的几何图形根本不会在屏幕上显示.然而,如果这是一个(非常)旧游戏,你从中获取数据,很可能一个包含所有资产的完整地图的多边形数量少于现代游戏中屏幕上可见的多边形.在这种情况下,您不会遇到任何性能问题.
如果你真的遇到了性能问题,你需要找到你想花多少时间,确定(不)可见的,以及实际呈现它的平衡.10年前,保持尽可能多的光栅化时间几乎完全像素仍然是至关重要的.现代GPU具有如此多的备用功率,只需粗略选择要包含在渲染中的内容就足够了.
然而,这些计算完全超出OpenGL或任何其他3D光栅化API(例如Direct3D)的范围 - 他们的任务是使用复杂的光栅化方法将三角形绘制到屏幕上; 没有对象管理,没有更高级别的功能.所以由你来实现这一点.
典型的方法是使用空间细分结构.最受欢迎的是Kd树,八角树和BSP树.BSP树在空间上非常有效,但计算量较大.我个人更喜欢Kd树和八叉树的混合/组合,因为这些很容易修改以跟随场景中的动态变化.更新BSP树的重量要大很多(通常需要完全重新计算).
鉴于这种空间结构,很容易确定一个点是否位于特定的感兴趣区域.通过几何约束(如平面)选择树中的节点也非常简单.这使得实现粗视锥体剔除变得非常容易:使用平截头体剪切平面从平面内的树中选择所有节点.为了使GPU的生活更轻松,您可能希望对远近的节点进行排序; 树结构再次帮助您,因为您可以递归地对树进行排序,从而产生几乎最优的O(n log(n))复杂度.
如果仍需要提高渲染性能,则可以使用树定义的空间划分,在递归到受测试边界限制的子树之前(隐藏)在遮挡查询中渲染测试几何体.
| 归档时间: |
|
| 查看次数: |
1153 次 |
| 最近记录: |