learnOpenGL 4.8 高级GLSL

115 阅读1分钟

内建变量

1、顶点着色器变量

gl_Position
它是顶点着色器的裁剪空间输出位置向量

gl_PointSize
我们能够选用的其中一个图元是GL_POINTS,如果使用它的话,每一个顶点都是一个图元,都会被渲染为一个点。我们可以通过OpenGL的glPointSize函数来设置渲染出来的点的大小

glEnable(GL_PROGRAM_POINT_SIZE);

gl_VertexID
整型变量gl_VertexID储存了正在绘制顶点的当前ID。当(使用glDrawElements)进行索引渲染的时候,这个变量会存储正在绘制顶点的当前索引。当(使用glDrawArrays)不使用索引进行绘制的时候,这个变量会储存从渲染调用开始的已处理顶点数量。

2、片元着色器变量
gl_FragCoord
gl_FragCoord的x和y分量是片段的窗口空间(Window-space)坐标,其原点为窗口的左下角。

gl_FrontFacing
gl_FrontFacing变量是一个bool,如果当前片段是正向面的一部分那么就是true,否则就是false。这个变量只可读取,不可修改。

gl_FragDepth
要想设置深度值,我们直接写入一个0.0到1.0之间的float值到输出变量就可以了:

gl_FragDepth = 0.0; // 这个片段现在的深度值为 0.0

接口块

在shader中可以输入输出类似于结构体的数据块

out VS_OUT
{
    vec2 TexCoords;
} vs_out;

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0);    
    vs_out.TexCoords = aTexCoords;
}  
in VS_OUT
{
    vec2 TexCoords;
} fs_in;

uniform sampler2D texture;

void main()
{             
    FragColor = texture(texture, fs_in.TexCoords);   
}

事例代码中大写的"VS_OUT"我块名,前后必须一致,小写的为实例名,可以变动。