0

假设我有一个 3D 三角形网格和一个可以渲染网格的 OpenGL 帧缓冲区。

对于每个渲染的像素,我需要构建一个渲染到该像素的三角形列表,即使是那些被遮挡的。

我能想到的唯一方法是单独渲染网格中的每个三角形,然后遍历帧缓冲区中的每个像素以确定它是否受到三角形的影响(使用深度缓冲区或用户定义的片段着色器输出变量)。然后我必须清除帧缓冲区并对下一个三角形执行相同的操作。

有没有更有效的方法来做到这一点?

我考虑过,对于片段着色器中的每个片段,写出一个三角形标识符,但 GLSL 不允许输出整数列表。

4

1 回答 1

1

对于每个渲染的像素,我需要构建一个渲染到该像素的三角形列表,即使是那些被遮挡的。

您将无法为整个场景执行此操作。没有允许您将“列表”与每个像素相关联的结构。

您可以使用选择缓冲区获取影响特定区域的图元列表(请参阅 参考资料glRenderMode(GL_SELECT))。

您可以使用模板缓冲区技术获得场景深度复杂性。

如果总共有 8 个三角形,那么您可以使用模板缓冲区获取影响每个像素的三角形列表(基本上,为每个三角形分配唯一的 (1 << n) 模板值,并将其与每个模板 OP 的现有模板缓冲区值或)。

但是要在一般情况下解决它,您需要自己的光栅化器和大量内存来存储每个像素的三角形列表。毕竟,这个问题与多层深度缓冲区非常相似。

有没有更有效的方法来做到这一点?

实际上,是的,但它不是硬件加速的,OpenGL 与它无关。将所有栅格化三角形存储在 OCT 树中。通过 OCT 树为您要测试的每个像素发射一条“射线”,并计算该射线击中的三角形。那是碰撞检测问题。

于 2012-05-04T18:07:52.983 回答