顶点着色器变量
gl_PointSize :可以设置渲染出来点的大小。使用
glEnable(GL_PROGRAM_POINT_SIZE);`
开始启用点大小设置,点的大小会随着观察者距顶点距离变远而增大。
void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0);
gl_PointSize = gl_Position.z;
}
gl_VertexID:整型变量gl_VertexID储存了正在绘制顶点的当前ID当(使用glDrawElements)进行索引渲染的时候,这个变量会存储正在绘制顶点的当前索引。当(使用glDrawArrays)不使用索引进行绘制的时候,这个变量会储存从渲染调用开始的已处理顶点数量。
片段着色器变量
gl_FragCoord:因为gl_FragCoord的z分量等于对应片段的深度值。l_FragCoord的x和y分量是片段的窗口空间(Window-space)坐标,其原点为窗口的左下角。
gl_FrontFacing:gl_FrontFacing将会告诉我们当前片段是属于正向面的一部分还是背向面的一部分。
gl_FragDepth:输入变量gl_FragCoord能让我们读取当前片段的窗口空间坐标,并获取它的深度值,但是它是一个只读(Read-only)变量
在写入gl_FragDepth时,你就需要考虑到它所带来的性能影响。然而,从OpenGL 4.2起,我们仍可以对两者进行一定的调和,在片段着色器的顶部使用深度条件(Depth Condition)重新声明gl_FragDepth变量:
layout (depth_) out float gl_FragDepth;
condition可以为下面的值:
条件 描述
any 默认值。提前深度测试是禁用的,你会损失很多性能
greater 你只能让深度值比gl_FragCoord.z更大
less 你只能让深度值比gl_FragCoord.z更小
unchanged 如果你要写入gl_FragDepth,你将只能写入gl_FragCoord.z的值
接口块
到目前为止,每当我们希望从顶点着色器向片段着色器发送数据时,我们都声明了几个对应的输入/输出变量。将它们一个一个声明是着色器间发送数据最简单的方式了,但当程序变得更大时,你希望发送的可能就不只是几个变量了,它还可能包括数组和结构体。
为了帮助我们管理这些变量,GLSL为我们提供了一个叫做接口块(Interface Block)的东西,来方便我们组合这些变量。接口块的声明和struct的声明有点相像,不同的是,现在根据它是一个输入还是输出块(Block),使用in或out关键字来定义的。
#

本文详细介绍了顶点着色器中的gl_PointSize、gl_VertexID,以及片段着色器中的gl_FragCoord、gl_FrontFacing和gl_FragDepth。此外,探讨了接口块的使用,如何通过in/out关键字组织数据,以及Uniform缓冲对象的应用,包括std140布局规则和Uniform块的管理。深度控制在片段着色器中的实现也做了说明。
最低0.47元/天 解锁文章
2152

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



