这可能是一个简单的问题。作为GLSL的新手,我宁愿在这里问。 现在,在顶点着色器中,我可以通过以下方式获取世界坐标系中的位置:
gl_Position = ftransform();
posWorld = gl_ModelViewMatrix * gl_Vertex;
问题是:现在我可以得到所有顶点中posWorld的最大/最小值吗?这样我可以获得顶点深度的范围,但不能获得深度缓冲区的范围。
如果这是不可能的,我怎样才能获得世界坐标系中近/远平面的z值?
致以诚挚的问候,
健
最佳答案
是的,使用 OpenGL 是可能的。我正在使用类似的技术在 GPU 上计算对象的边界框。步骤如下:
- 在其自己的 FBO 中安排一个大小为 1x1 的 RGBA_32F 类型的渲染缓冲区。设置为渲染目标(没有深度/模板,只有单个颜色平面)。它可以是更大纹理的像素,在这种情况下,您需要正确设置视口(viewport)。
- 清晰且具有基本值(value)。对于“min”来说,它将是一个巨大的数字,对于“max”来说,它将是负巨大的数字。
- 根据系数 (1,1) 设置混合函数“min”或“max”。
- 使用着色器绘制网格,该着色器生成坐标为 (0,0,0,1) 的点。输出包含原始顶点世界位置的颜色。
您可以从这里进一步优化。例如,您可以通过利用几何着色器并否定输出像素之一的位置,在一次绘制调用中同时获得“最小”和“最大”。
关于glsl - [GLSL]如何比较世界坐标下所有顶点的z值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7517455/