[英]How the vertex shader is passing to the fragment shader
在下面的顶点着色器中,我无法理解第 1 行和第 2 行给出的输出。
#version 450
out vec2 texcoord;
void main()
{
texcoord = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2); // Line 1
gl_Position = vec4(texcoord * 2.0f - 1.0f, 0.0f, 1.0f); // Line 2
}
这是一种使用单个三角形定义全屏四边形的方法。
全屏四边形可以绘制为两个三角形,也可以绘制为包含四边形的一个大三角形。 有关更多信息,请参见此处。
在您的示例中,将指示glDrawArrays
函数绘制 3 个顶点,导致顶点着色器针对gl_VertexID
0、1 和 2 运行 3 次。这会产生以下数据:
gl_VertexID 0: texcoords(0.0F, 0.0F), gl_Position(-1.0F, -1.0F)
gl_VertexID 1: texcoords(2.0F, 0.0F), gl_Position( 3.0F, -1.0F)
gl_VertexID 2: texcoords(0.0F, 2.0F), gl_Position(-1.0F, 3.0F)
这在屏幕空间坐标中定义了一个三角形,从屏幕的左下角开始,然后向右(“超出屏幕”),最后到达左上角(“超出屏幕”)。 四边形的右上角位于三角形的斜边上。 相应地调整 UV 坐标。 在渲染四边形的片段之前,三角形的多余部分将被剪掉。
确切的计算如下:
我们可以假设此代码仅适用于gl_VertexID
0、1 和 2。
gl_VertexID & 2
中的按位与清除除第二个以外的所有位,因此值 2 保持为 2,任何其他值变为 0。首先<< 1
移位,只有gl_VertexID == 1
变为 2 和任何其他值变为 0。
对于gl_Position
,纹理坐标从范围 [0, 2] 映射到 [-1, 3] 以获得三角形顶点的位置。
第1行计算纹理坐标(纹理图像中0..1范围内的U,V)。 它填充了texcoord
变量,在这一行中定义为着色器的输出:
out vec2 texcoord;
第 2 行计算顶点位置,并更新预定义的全局变量gl_Position
。 然后,此变量可用作着色器的输出。
有关 opengl 预定义全局变量的更多信息: Built-in Variable (GLSL) 。
有关gl_position
更多信息: 文档。
关于输出内容:
看起来 U 纹理坐标 ( (gl_VertexID << 1) & 2
) 是 0 或 1,具体取决于gl_VertexID
中的最低有效位,而 V 纹理坐标 ( gl_VertexID & 2
) 是 0 或 1,具体取决于第二位的gl_VertexID
。
如果U
为 1,则gl_Position
x
为 1,否则为 -1。 同样, y
依赖于V
我不能说为什么应用程序要求那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.