OpenGL - 內建变量及内置函数
内建变量:
着色器代码的开发中会用到很多变量,其中大部分可能是由开发人员根据需求自定义的,但着色器中也提供了一些用来满足特性需求的內建变量。
特点:
1.內建变量不需要声明就可以使用;
2.一般用来实现 管线渲染固定功能部分 与 自定义顶点 或者 片元着色器 之间的信息交互。
分类: 內建变量根据信息传递方向分为两类
1. 输入变量: 输入变量负责将渲染管线中固定部分产生的信息传递进着色器。
2. 输出变量: 输出变量负责将着色器产生的信息传递给渲染管线中固定部分。
1】顶点着色器
顶点着色器中的内置变量主要是输出变量。gl_Position,gl_PointSize等。
我们也会 在顶点着色器中根据需要 给这些内建变量赋值,以便由渲染管线中的图元装配与光栅化等后续固定功能阶段进行进一步的处理。
gl_Position
|
顶点着色器从应用程序中获得原始的顶点位置数据,这些原始的顶点数据在定点着色器中经过平移、旋转、缩放等数学变换后,生成新的定点位置。新的顶点位置通过在顶点作色器中写入gl_Position传递到渲染线管的后继阶段继续处理。
gl_Position的类型是vec4,写入的顶点位置数据也必须与其类型一致。几乎在所有的顶点着色器中 都必须对gl_Position写入适当的值,否则厚积阶段的处理结果将是不确定的。
|
gl_PointSize
|
顶点着色器中可以计算一个点的大小(单位是像素),并将其赋值给gl_PointSize(标量 float) 以传递给渲染管线。如果没有明确赋值的话,就会采用默认值1。
gl_PointSize的值一般只有在采用电汇至方式后才有意义。
关于绘制方式,我们后面详细介绍。
|
以上为主要使用的内置变量,下方列表显示顶点着色器中的内置变量
名称 |
类型 |
描述 |
gl_Color |
vec4 |
输入属性-表示顶点的主颜色 |
gl_SecondaryColor |
vec4 |
输入属性-表示顶点的辅助颜色 |
gl_Normal |
vec3 |
输入属性-表示顶点的法线值 |
gl_Vertex |
vec4 |
输入属性-表示物体空间的顶点位置 |
gl_MultiTexCoordn |
vec4 |
输入属性-表示顶点的第n个纹理的坐标 |
gl_FogCoord |
float |
输入属性-表示顶点的雾坐标 |
gl_Position |
vec4 |
输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。 |
gl_ClipVertex |
vec4 |
输出坐标,用于用户裁剪平面的裁剪 |
gl_PointSize |
float |
点的大小 |
gl_FrontColor |
vec4 |
正面的主颜色的varying输出 |
gl_BackColor |
vec4 |
背面主颜色的varying输出 |
gl_FrontSecondaryColor |
vec4 |
正面的辅助颜色的varying输出 |
gl_BackSecondaryColor |
vec4 |
背面的辅助颜色的varying输出 |
gl_TexCoord[] |
vec4 |
纹理坐标的数组varying输出 |
gl_FogFragCoord |
float |
雾坐标的varying输出 |
gl_Position是vec4类型的?不是应该是vec3吗,多出来的那个是什么呀?
(有人肯定会回答齐次坐标!!!所以你要看下面的答案:)
在3d图形用到了 4x4的矩阵(4行4列),矩阵乘法要求 nxm * mxp(n行m列 乘 m行p列)才能相乘
注意:m是相同的,所以 1x4 * 4x4 才能相乘(nxm * mxp)。
2】片元着色器
片元着色器中的内建变量分为输入变量以及输出变量
输入变量
片元着色器中的内建输入变量主要有 gl_FragCoord 和 gl_FrontFacing。这两个内建变量都是只读的,由渲染管线中片元着色器之前阶段生成。
gl_FragCoord 类型 vec4
作用:gl_FragCoord中含有当前片元对于窗口位置的坐标值(x、y、z、1/w)
其中x与y分别为片元相对于窗口的位置坐标
如果窗口大小为800*480(像素)
那么X取值范围(0-800)
y的取值范围(0-480)
z部分为该片元的深度
(通过该变量可以实现窗口位置相关的操作,例如金绘制窗口中指定的区域的内容 等等。。)
gl_FrontFacing 类型 布尔值
作用:读取这个内建变量的值可以判断正在处理的片元是否属于在光栅化阶段生成此片元的对应图元的正面。
如果是正面 值为true
如果是反面 值为false
注意:对于点 ,线段 等没有正反面之分的图元,他们的生成的片元都会默认为正面的。
对于三角形来说,其正反面取决于应用程序中对卷绕的设置以及图元中顶点的具体卷绕情况。
输出变量
片元着色器中的内建输出变量主要有 gl_fragColor 与 gl_FragData
gl_fragColor 类型 vec4
作用:由片元着色器写入计算完成的片元颜色值,此颜色值将送入渲染管线的后继阶段经行处理
gl_fragData 类型 vec4类型的数组
作用:通过写入的信息讲渲染线管中的后继过程使用
实际开发中,对上述两个內建输出变量赋值时应该根据情况仅选用其中的一个,而不应该同时对两个进行赋值。若执行了 discard 操作则两个內建变量都不需要写入值了。根据其他笔者开发禁言而言,大部分情况下都是给 gl_fragColor 内建变量赋值的。
以下片元着色器内置变量
名称 |
类型 |
描述 |
gl_Color |
vec4 |
包含主颜色的插值只读输入 |
gl_SecondaryColor |
vec4 |
包含辅助颜色的插值只读输入 |
gl_TexCoord[] |
vec4 |
包含纹理坐标数组的插值只读输入 |
gl_FogFragCoord |
float |
包含雾坐标的插值只读输入 |
gl_FragCoord |
vec4 |
只读输入,窗口的x,y,z和1/w |
gl_FrontFacing |
bool |
只读输入,如果是窗口正面图元的一部分,则这个值为true |
gl_PointCoord |
vec2 |
点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和点精灵开启的情况下。 |
gl_FragData[] |
vec4 |
使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用。 |
gl_FragColor |
vec4 |
输出的颜色用于随后的像素操作 |
gl_FragDepth |
float |
输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替 |
内置函数
与其他高级语言类似,为了方便开发,OpenGL ES着色语言也提供了很多的内置函数。
这些函数大都已经被重载,一般具有4种变体,分别用来接收和返回float、vec2、vec3以及vec4类型的值。
1.内置函数都是以最优的方式实现的,有部分函数甚至由硬件直接支持,大大提高了执行效率!
2大部分内置函数同时适用于顶点作色器与片元着色器,但也有部分内置函数只适合顶点着色器或者片元着色器的
内置函数按照设计目的分为3个类型:
提供独特硬件功能访问的接口 |
像纹理采样系列的函数,这些函数用户是无法自己开发的。
着色语言去年通过提供特定内置函数对这些硬件功能进行封装
我们要使用就直接调用就成
|
简单的数学函数 |
像:abs (求摸)、foolr(取整)等
(自己可以写,但是如果对底层不了解,实现方式机会效率低)
|
一些复杂的函数 |
像:三角函数等 高等数学知识的函数 |