假设我有一个3D三角形网格,以及一个可以渲染网格的OpenGL帧缓冲区。
对于每个渲染像素,我需要构建一个渲染到该像素的三角形列表,甚至是那些被遮挡的三角形。
我能想到这样做的唯一方法是从网格中单独渲染每个三角形,然后遍历帧缓冲区中的每个像素以确定它是否受到三角形的影响(使用深度缓冲区或用户定义的片段)着色器输出变量)。然后我必须清除帧缓冲区并为下一个三角形做同样的事情。
有更有效的方法吗?
我认为,对于片段着色器中的每个片段,写出一个三角形标识符,但GLSL不允许输出整数列表。
答案 0 :(得分:1)
对于每个渲染像素,我需要构建一个渲染到该像素的三角形列表,甚至是那些被遮挡的三角形。
您将无法在整个场景中执行此操作。没有允许您将“列表”与每个像素相关联的结构。
您可以使用选择缓冲区获取影响特定区域的基元列表(请参阅glRenderMode(GL_SELECT)
)。
使用模板缓冲技术可以获得场景深度复杂度。
如果总共有8个三角形,则可以使用模板缓冲区获得影响每个像素的三角形列表(基本上,为每个三角形分配唯一的(1<< n)模板值,并将其与现有的模板缓冲区一起使用每个模板OP的值。
但是要在通用情况下解决它,你需要自己的光栅化器和大量内存来存储每像素三角形列表。毕竟,这个问题与多层深度缓冲区非常相似。
有更有效的方法吗?
实际上,是的,但它不是硬件加速的,OpenGL没有任何关系。将所有栅格化三角形存储在OCT树中。对于要测试的每个像素,通过该OCT树启动“光线”,并计算此光线命中的三角形。这是碰撞检测问题。