glsl - [GLSL]如何比较世界坐标下所有顶点的z值?

标签 glsl depth vertex-shader zbuffer

这可能是一个简单的问题。作为GLSL的新手,我宁愿在这里问。 现在,在顶点着色器中,我可以通过以下方式获取世界坐标系中的位置:

    gl_Position = ftransform();
    posWorld = gl_ModelViewMatrix * gl_Vertex;

问题是:现在我可以得到所有顶点中posWorld的最大/最小值吗?这样我可以获得顶点深度的范围,但不能获得深度缓冲区的范围。

如果这是不可能的,我怎样才能获得世界坐标系中近/远平面的z值?

致以诚挚的问候,

最佳答案

是的,使用 OpenGL 是可能的。我正在使用类似的技术在 GPU 上计算对象的边界框。步骤如下:

  1. 在其自己的 FBO 中安排一个大小为 1x1 的 RGBA_32F 类型的渲染缓冲区。设置为渲染目标(没有深度/模板,只有单个颜色平面)。它可以是更大纹理的像素,在这种情况下,您需要正确设置视口(viewport)。
  2. 清晰且具有基本值(value)。对于“min”来说,它将是一个巨大的数字,对于“max”来说,它将是负巨大的数字。
  3. 根据系数 (1,1) 设置混合函数“min”或“max”。
  4. 使用着色器绘制网格,该着色器生成坐标为 (0,0,0,1) 的点。输出包含原始顶点世界位置的颜色。

您可以从这里进一步优化。例如,您可以通过利用几何着色器并否定输出像素之一的位置,在一次绘制调用中同时获得“最小”和“最大”。

关于glsl - [GLSL]如何比较世界坐标下所有顶点的z值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7517455/

相关文章:

GLSL如何设置平面的透明度?

opengl - GLSL memoryBarrierShared() 有用吗?

OpenGL:旧 ATI 卡上的 "Fragment Shader not supported by HW"

javascript - 如何在javascript中将嵌套集转换为嵌套数组?

iphone - 我想从 iPhone 7 Plus 获取深度数据(不是视差)

opengl - 片段着色器如何确定顶点着色器输出的片段数量?

c++ - 在 OpenGL 中从 3D 切换到 2D

opengl - GLSL - 使用自定义输出属性而不是 gl_Position

c++ - Mac 上的 OpenGL GLSL 着色器无法编译

c - 堆插入未排序