本文为L_Ares个人写作,如需转载请表明原文出处。
本节主要介绍GLSL中的常见内建变量都有哪些,作用是什么,并不是全部,而是常见。
一、顶点着色器(VertexShader)
1. 顶点着色器的内建变量
(1). gl_VertexID :
这是一个输入的变量,它的作用是保存你输入的每一个顶点的索引值,也就是你输入的每一个顶点的ID。比如你输入的第一个顶点,第二个顶点,第三个顶点。。。等等,都是由它来确认的。它是一个标签,一般情况下都是默认高精度(highp
)来修饰的。
(2). gl_InstanceID :
保存当前绘制的是第几个图形的编号。
(3). gl_Position :
保存的是所有运算完成后的,顶点坐标。它是一个高精度(highp
)的浮点型的(float
)4维向量(vec4
)。
(4). gl_PointSize :
表示的是每个顶点的大小。点精灵的大小。
(5). gl_FrontFacing :
这是一个bool
值,表示的是是否要做前面。
2. 顶点着色器的内建Uniform属性
窗口深度值的范围:gl_DepthRangeParameters
这是一个结构体,结构体内包含了高精度浮点型的近剪切面深度,远剪切面深度,和远近剪切面深度的差值。
struct gl_DepthRangeParameters {
highp float near;
highp float far;
highp float diff;
}
uniform gl_DepthRangeParameters gl_DepthRange;
3. 顶点着色器的内建常量
在这里可以发现,下述的内建常量全部都是const
修饰符修饰的,所以很明显是不可以修改的,精度全部都是mediump
所以全部都是中精度的,数据类型全部是int
,所以全都是整型的 。
(1). 顶点数据的最大量,就是单次可以指定的,最多支持多少个顶点同时输入。
const mediump int gl_MaxVertexAttribs = 16;
(2). 顶点着色器中,最多支持的Uniform修饰的数据是多少。
const mediump int gl_MaxVertexUniformVectors = 256;
(3). 输出的变量的最大数量。
const mediump int gl_MaxVertexOutputVectors = 16;
(4). 最多可以单次使用多少个纹理单元。
const mediump int gl_MaxVertexTextureImageUnits = 16;
(5). 在顶点着色器和片元着色器中,两个一起可以使用的最多的纹理单元的数量
const mediump int gl_MaxCombinedTextureImageUnits = 32;
二、片元着色器(FragmentShader)
1. 片元着色器的内建变量
下面的前三个变量都是只读的!!!
(1). gl_FragCoord :
表示的是片段中的窗口相对坐标。就是片元着色器中,像素点的坐标在屏幕上的一个相对坐标值。
(2). gl_FrontFacing :
bool
类型,表示的是你当前渲染的这个图形它是正面的还是背面的,是正面的话,可以得到一个true
,如果渲染的是背面的话,可以得到一个false
。
(3). gl_PointCoord :
表示我们在使用点精灵的时候,它会给我们返回一个点精灵的坐标。(点精灵就是点图元,因为我们在OpenGL中构成图形的三个基本图元只有点,线,三角形,分别可以叫点精灵,线精灵,三角形精灵)
(4). gl_FragDepth :
其实这个变量是只写的。表示每一个片元的深度值。就是说,在片元着色器中写入它时,它会覆盖片元的功能深度值。但是我们应该尽量减少手动的写入深度值,因为这样可能会使GPU禁用许多深度值的优化。
2. 片元着色器的内建常量
和顶点着色器一样,片元着色器的内建常量也都是const
修饰的,不可修改的常量,也都是mediump
中精度的int
整形常量。
(1). 片元着色器中的输入变量的最大数量。也就是你给片元着色器设置用来in
的变量不能超过15个。
const mediump int gl_MaxFragmentInputVectors = 15;
(2). 片元着色器中的纹理单元的最大数量。记得上面的顶点着色器的纹理单元最大数量和Combined的最大数量吗?
顶点着色器的纹理单元最大数量+片元着色器的纹理单元的最大数量=MaxCombinedTextureUnits
const mediump int gl_MaxTextureImageUnits = 16;
(3). 片元着色器中允许单次输入的最大Uniform修饰的变量数量
const mediump int gl_MaxFragmentUniformVectors = 224;
(4). 多重渲染最多只支持4个。drawbuffer也就是OpenGL ES要向绘制buffer上绘制图形,也就是可绘制buffer,也就是RT(Render Target)。
const mediump int gl_MaxDrawBuffers = 4;
3. 内建函数
常见的内建函数:
(1). dot :
点乘
(2). cross :
叉乘
(3). texture2D :
用于对纹理的采样。也就是获取纹素。
(4). normalize :
对一个向量标准化(规格化)。
(5). clamp :
将一个向量固定在一个范围内,一个最小值和一个最大值之间。超过这个范围的都会取到对应的最小或者最大值。
其他内建函数如图3.1所示:
![](https://img.haomeiwen.com/i16702189/a3e1a0308c623469.png)
网友评论