3d遮挡剔除

eco*_*utu 6 opengl 3d occlusion culling

我正在用C++/openGL编写类似静态3d块世界的Minecraft.我正在努力提高帧速率,到目前为止,我已经使用八叉树实现了截锥体剔除.这有帮助,但我仍然看到中等到坏的帧速率.下一步是通过更近的立方体来剔除从视点隐藏的立方体.但是,我无法找到很多关于如何实现这一目标的资源.

Ebo*_*ike 8

创建启用了Z缓冲区(或"深度缓冲区")的渲染目标.然后确保对所有不透明物体进行排序,使它们从前到后渲染,即最先与摄像机最近的物体.在渲染所有不透明对象之后,仍然需要将使用Alpha混合的任何内容渲染回前方.

另一种技术是遮挡剔除:您可以便宜地"干式渲染"几何体,然后找出深度测试中有多少像素失败.DirectX和OpenGL中有遮挡查询支持,但并非每个GPU都能做到这一点.

缺点是在渲染和获取结果之间需要延迟 - 取决于设置(如使用预测平铺时),它可能是一个完整的帧.这意味着你需要在那里发挥创意,比如渲染一个比对象本身更大的边界框,并在相机切割后消除结果.

还有一件事:更传统的解决方案(您可以同时使用遮挡剔除)是一个房间/门户系统,您可以将区域定义为"房间",通过"门户"连接.如果您当前的房间看不到门户网站,则无法看到与其连接的房间.即便如此,您也可以单击视口到通过门户网站看到的内容.


rya*_*anm 5

我在这个我的世界级渲染器中采用的方法基本上是截头限制的洪水填充.16x16x128块分为16x16x16个块,每个块都带有一个具有相关几何形状的VBO.我在玩家所在位置的chunklet网格中开始填充,以找到要渲染的存储块.填充受限于:

  1. 视锥体
  2. 固体存储块 - 如果存储块的整个侧面是不透明的块,则填充不会进入该方向的存储块
  3. 方向 - 泛洪不会反转方向,例如:如果当前的存储块位于起始存储块的北部,则不要向南部的存储块充满洪水

它似乎工作正常.我是在Android上,所以虽然更复杂的分析(Mike Daniels所指出的反向移植)会剔除更多的几何体,但我已经限制了CPU,所以没有多大意义.

我刚看到你对Alan的回答:剔除不是你的问题 - 这就是你发送给OpenGL的速度和速度.

绘制内容:不为每个块渲染立方体,渲染边框不透明块的透明块的面.考虑一块3x3x3的立方体,比方说,石块:没有点绘制中心区块,因为玩家无法看到它.同样,玩家永远不会看到两个相邻石块之间的面,所以不要画它们.

如何绘制:如Alan所述,使用VBO批量几何.你不会相信他们做得多快.

一种更简单的方法,即对现有代码进行最少的更改,就是使用显示列表.这是我的世界使用的.