繁体   English   中英

顶点着色器如何传递给片段着色器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM