【发布时间】:2013-09-06 15:27:19
【问题描述】:
我的世界被分割成一个八叉树(tris 被自动分割),每个卡盘都有自己的索引缓冲区(vbo 是共享的)。我已将 FBO 设置为在一个简单且最少的预通道上写入深度纹理,但我很难想象下一步。
我希望从前到后组织平截头体(从八叉树返回)中的块,然后将其渲染到深度纹理。如果没有发生写入,则可以假定卡盘是隐藏的。但是,我不知道在 opengl 中是否可以进行这样的测试,因为我一直相信在绑定 FBO 时您无法读取深度纹理。另外,我不知道这样的比较测试会如何发生(FBO可以这样使用吗?)
另一种方法是使用最终深度纹理进行最终渲染(将其传递给片段着色器),并消除被认为低于从预通道获取的深度纹理中确定的值的片段(早期Z?)。
我可以选择第二种方法,但更愿意关闭块以最小化绘制调用和材质绑定。
我希望有人能对这个问题有所了解,因为我一直在寻找“最好的方法”来做到这一点,但我对这些方法和 FBO 的了解相对有限,我只将 FBO 用于阴影映射灯.
抱歉,打扰了 - 我知道硬件遮挡测试,但希望实现一个更通用的深度遮挡系统,不需要“等待”。
编辑:请注意,对于 pre-pass,我只打算渲染一个紧贴的边界框开始。
【问题讨论】:
-
不太清楚你在问什么。您正在谈论的许多提议的算法实际上都没有意义。例如,如果您有最终的深度缓冲区(又名:您进行了深度预传递),为什么需要片段着色器来“关闭片段......”?这将理所当然地发生,只需再次渲染对象即可。
-
嗨,Nicol,我想我明白你在说什么。 GFX 卡在片段着色器中插值时会自动关闭未通过深度测试的片段,对吗?如果是这种情况,那我什至不需要做预通行证???但是,我想弄清楚的是从八叉树返回的卡盘的深度遮挡,以防止在最终渲染过程中绑定它们(包括纹理等)。把它想象成一个 BSP 系统,但只有三角形块,并使用深度缓冲区在第二遍之前消除整个块。