RealTime-Rendering14-Advanced GLSL

Advanced GLSL

gl_PointSize

GLSL定义了一个叫做gl_PointSize输出变量,它是一个float变量,可以使用它来设置点的大小。在顶点着色器中修改点的大小的话,就可以对每个顶点设置不同的值了。
在顶点着色器中修改点大小的功能默认是禁用的,如果需要使用它的话,需要启用OpenGL的GL_PROGRAM_POINT_SIZE:

1
glEnable(GL_PROGRAM_POINT_SIZE);

gl_VertexID

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

gl_FragCoord

gl_FragCoord的x和y分量是片段的屏幕坐标,其原点为窗口的左下角.z分量等于对应片段的深度值.

1
2
3
4
5
6
7
void main()
{
if(gl_FragCoord.x < 400)
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
else
FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

01.png

gl_FrontFacing

gl_FrontFacing变量是一个bool值,如果当前片段是正面的一部分返回true,否则返回false。例如可以创建一个立方体,在内部和外部使用不同的纹理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#version 330 core
out vec4 FragColor;

in vec2 TexCoords;

uniform sampler2D frontTexture;
uniform sampler2D backTexture;

void main()
{
if(gl_FrontFacing)
FragColor = texture(frontTexture, TexCoords);
else
FragColor = texture(backTexture, TexCoords);
}

02.png

gl_FragDepth

输入变量gl_FragCoord能让我们读取当前片段的屏幕空间坐标,并获取它的深度值,但它是一个只读变量,不能修改片段的屏幕空间坐标。GLSL提供了一个叫做gl_FragDepth的输出变量,可以使用它来在着色器内修改片段的深度值。
要想设置深度值,直接写入一个0.0到1.0之间的float值到输出变量gl_FragDepth就可以了:
如果着色器没有写入值到gl_FragDepth,它会自动取用gl_FragCoord.z的值。