关于GLSL管道的几个问题

时间:2013-06-10 08:23:54

标签: opengl glsl openframeworks

我在使用DirectX时曾经编写过HLSL代码但是已经忘记了很多,我现在正在试图找出GLSL以及它是如何工作的。我在OpenFramework中使用OpenGL的固定管道,这对我来说是一个新概念,但它是一个很好的起点。

我的第一个问题:对于顶点着色器,在进入片段着色器之前将计算所有顶点,对吗?所以我可以在这里预先计算信息,比如找到所有顶点的Z pos的最小值/最大值进入帧缓冲区?

然后在进入片段着色器时,我可以通过变量变量访问这些预先计算的值吗?因此,如果我在变量变量中设置顶点着色器的值(如顶点z位置的最小值/最大值),我可以稍后从片段着色器中访问这些设置值吗?

访问Z元素时,内置变量gl_FragCoord似乎总是为每个顶点产生1.0。这与我如何在顶点着色器中转换顶点的位置有关吗?

最后我试图找到所有顶点的最小/最大Z位置并将它们传递给片段着色器,以下代码是否正确?

varying float minZ = 9999.9;
varying float maxZ = -9999.9;

void main()
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_TexCoord[1] = gl_MultiTexCoord1;
    gl_FrontColor  = gl_Color;
    gl_Position    = ftransform();

    if (gl_Position.z < minZ) minZ = gl_Position.z;
    if (gl_Position.z > maxZ) maxZ = gl_Position.z;
}

很抱歉,如果这是在StackOverflow上提问的不恰当方式,也许我应该把它分成几个问题。

1 个答案:

答案 0 :(得分:3)

  

对于顶点着色器,在进入片段着色器之前将计算所有顶点,对吗?

没有

  

所以我可以在这里预先计算信息,比如找到帧缓冲区中所有顶点的Z pos的最小值/最大值?

不直接,因为顶点着色器一次看到一个顶点并且GPU并行运行。确定min / max需要像map-reduce这样有效,这需要某种方式在线程之间传递信息。它可以完成,但效率不高。

在您的代码段中,minZmaxZ 不是所有顶点之间共享的全局变量。它们是与当前处理的顶点相关的局部变化。

  

然后在进入片段着色器时,我可以通过变量变量来访问这些预先计算的值吗?

这些并非真正“预先计算好”,它们只是在之前的一步中处理过。这不是首先为所有顶点执行顶点着色器,然后是片段着色器。每个基元(即单个三角形)直接穿过各个阶段而不存储在其间。