LearnOpenGL之高级GLSL

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

高级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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值