高级GLSL
一、GLSL的内建变量
内建变量均以"gl_"为前缀
1.顶点着色器的内建变量
(1)gl_PointSize
用来改变顶点,点的大小,通常用于粒子系统
# 记得开启
glEnable(GL_PROGRAM_POINT_SIZE);
void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
gl_PointSize = gl_Position.z;
}
(2)gl_VertexID
每个顶点的ID
如果使用glDrawElements绘制,则是当前顶点索引
如果使用glDrawArrays绘制,则是当前绘制顶点数的计数
2.片段着色器的内建变量
(1)gl_FragCoord
gl_FragCoord.xy代表每个片段的窗口坐标,原点在左下角
例如:gl_FragCoord的x和y分量是片段的窗口空间(Window-space)坐标,其原点为窗口的左下角。我们已经使用glViewport设定了一个800x600的窗口了,所以片段窗口空间坐标的x分量将在0到800之间,y分量在0到600之间。
gl_FragCoord.z代表了只可以读取的像素深度
(2)gl_FrontFacing
是一个bool变量,代表了面片的正反方向
(3)gl_FragDepth
代表了可以写的像素深度
从OpenGL 4.2起,我们仍可以对两者进行一定的调和,在片段着色器的顶部使用深度条件(Depth Condition)重新声明gl_FragDepth变量:
layout (depth_<condition>) out float gl_FragDepth;
二、接口块
用于着色器之间批量数据通信
形式为:块名(VS_OUT)要一样
顶点着色器:
out VS_OUT
{
vec2 TexCoords;
} vs_out;
片段着色器
in VS_OUT
{
vec2 TexCoords;
} fs_in;
三、Uniform缓冲对象
用于批量Uniform变量传递到着色器
1.在着色器形式为uniform块:
layout (std140) uniform Matrices
{
m

本文深入探讨了GLSL(OpenGL着色语言)的高级特性,包括内建变量、接口块和Uniform缓冲对象的使用方法。重点介绍了如何通过Uniform缓冲对象高效地传递大量Uniform数据到着色器。
最低0.47元/天 解锁文章
2572

被折叠的 条评论
为什么被折叠?



