我在使用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上提问的不恰当方式,也许我应该把它分成几个问题。
答案 0 :(得分:3)
对于顶点着色器,在进入片段着色器之前将计算所有顶点,对吗?
没有
所以我可以在这里预先计算信息,比如找到帧缓冲区中所有顶点的Z pos的最小值/最大值?
不直接,因为顶点着色器一次看到一个顶点并且GPU并行运行。确定min / max需要像map-reduce这样有效,这需要某种方式在线程之间传递信息。它可以完成,但效率不高。
在您的代码段中,minZ
和maxZ
不是所有顶点之间共享的全局变量。它们是与当前处理的顶点相关的局部变化。
然后在进入片段着色器时,我可以通过变量变量来访问这些预先计算的值吗?
这些并非真正“预先计算好”,它们只是在之前的一步中处理过。这不是首先为所有顶点执行顶点着色器,然后是片段着色器。每个基元(即单个三角形)直接穿过各个阶段而不存储在其间。