目录
8 内建函数
OpenGL ES着色语言为标量和向量操作定义了一套内建便利函数。有些内建函数可以用在多个类型的着色器中,有些是针对固定硬件的,所以这部分只能用在某个特定的着色器上。
内建函数基本上可以分为一下三类:
- 它们使用一些简便的方式提供必要的硬件功能,如材质贴图。这些函数单独通过着色器是无法模拟出来的。
- 它们展示了一些可以常简单的写入的繁琐操作(clamp, mix等),但是这些操作非常普遍,并且提供直接对硬件的支持。对于编译器来说,将表达式映射到复杂的装配线指令上是非常困难的。
- 它们提供了对图形硬件的操作,并且在适当时候进行加速。三角函数就是一个很好的例子。
有些函数名称和常见的C库函数类似,但是它们支持向量的输入和更多的传统标量输入。
建议应用程序尽量使用内建函数而不是在着色器中实现相同的计算,因为内建函数是经过最大优化的(如,有些内建函数是直接操作硬件的)。
用户定义的代码可以重载内建函数,但最好不要重新定义它们。
内建函数的输入参数(和相应的输出的参数)可以是float, vec2, vec3, vec4。对于函数的任何特定应用,实际的类型必须和所有的参数和返回值相同。就像mat,必须为mat2, mat3, mat4。
参数和返回值的精度修饰符是隐藏的,对于材质函数,返回类型的精度必须和采样器类型匹配。
uniform lowp sampler2D sampler;
highp vec2 coord;
...
lowp vec4 col = texture2D (sampler, coord); // texture2D 返回类型的精度为lowp
其他内建函数形参的精度修饰是没有任何关联的。对这些内置函数的调用将返回与调用的最高精度限定匹配的精度限定
输入参数。详见 4.5.2 精确限定符。
8.1 角度和三角函数
标识为angle的函数参数假定以弧度为单位。这些函数不可能出现被0除的情况,如果被除数为0,则结果是未定义的。
语法 | 描述 |
genType radians (genType degrees) | 将角度值转换成弧度值 |
genType degrees (genType radians) | 将弧度转换为角度 |
genType sin (genType angle) | 三角正弦 |
genType cos (genType angle) | 三角余弦 |
genType tan (genType angle) | 三角正切 |
genType asin (genType x) | 反正弦 |
genType acos (genType x) | 反余弦 |
genType atan (genType y, genType x) | y/x的反正切 |
genType atan (genType y_over_x) | y_over_x的反正切 |
8.2 指数函数
语法 | 描述 |
genType pow (genType x, genType y) | 返回x的y次方,即 x^y。 如果x<0,则返回值为未定义的。 如果x=0且y<=0,,则返回值为未定义的。 |
genType exp (genType x) | 返回x的自然指数,即 e^x |
genType log (genType x) | 返回x的自然对数,若返回值为y则满足 x=e^y 如果x<=0,则返回值为未定义的。 |
genType exp2 (genType x) | 返回2的x次方,即 2^x |
genType log2 (genType x) | 返回以2为底x的对数,若返回值为y则满足x=2^y 如果x<=0,则返回值为未定义的。 |
genType sqrt (genType x) | 返回x的平方根 如果x<0,则返回值为未定义的。 |
genType inversesqrt (genType x) | 返回x的平方根的倒数 如果x<=0,则返回值为未定义的。 |
8.3 常用函数
语法 | 描述 |
genType abs (genType x) | 返回x的绝对值 |
genType sign (genType x) | x<0 ,返回 -1.0 x=0 ,返回 0.0 x>0,返回 1.0 |
genType floor (genType x) | 返回不大于x的最接近x的整数 |
genType ceil (genType x) | 返回不小于x的最接近x的整数 |
genType fract (genType x) | 返回 x-floor(x),即x的小数部分 |
genType mod (genType x, float y) | 返回 x – y ∗ floor (x/y) 即 x对y取余得到的模数 |
genType mod (genType x, genType y) | 同上 |
genType min (genType x, genType y) genType min (genType x, float y) | 返回两者的最小值 |
genType max (genType x, genType y) genType max (genType x, float y) | 返回两者的最大值 |
genType clamp (genType x, genType minVal, genType maxVal) genType clamp (genType x, float minVal, float maxVal) | 返回 min (max (x, minVal), maxVal) 若minVal > maxVal 则结果为未定义的。 就是要将x截断到两个值之间。 |
genType mix (genType x, genType y, genType a) genType mix (genType x, genType y, float a) | 返回x和y的线性混合,即 x*(1−a)+ y*a |
genType step (genType edge, genType x) genType step (float edge, genType x) | 若 x<edge 则返回0.0 否则返回1.0 |
genType smoothstep (genType edge0, genType edge1, genType x) genType smoothstep (float edge0, float edge1, genType x) | 若x<edge0则返回0.0 若x>edge1则返回1.0 若在两者中间,则在0.0到1.0之间取一个平滑的Hermite差值。 等价于公式:
若edge0>edge1则结果为未定义的。 |
8.4 几何函数
这些操作都是应用在向量上的。
语法 | 描述 |
float length (genType x) | 返回向量x的长度 |
float distance (genType p0, genType p1) | 返回p0和p1之间的距离 |
float dot (genType x, genType y) | 返回x和y的点乘结果 |
vec3 cross (vec3 x, vec3 y) | 返回x和y的叉乘结果 |
genType normalize (genType x) | 返回和x方向相同的单位长度向量 |
genType faceforward(genType N, genType I, genType Nref) | 如果dot(Nref, I)<0,则返回N, 否则返回-N |
genType reflect (genType I, genType N) | 根据入射向量I和表面向量N,返回反射向量 I – 2 ∗ dot(N, I) ∗ N N必须归一化过了以确保得到期望的结果。 |
genType refract(genType I, genType N, float eta) | 根据入射向量I和表面向量N以及折射指数eta,返回反射向量 计算方式如下: k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I)) I和N必须归一化过了以确保得到期望的结果。 |
8.5 矩阵函数
语法 | 描述 |
mat matrixCompMult (mat x, mat y) | 逐个分量地将两个矩阵相乘。 result[i][j] = x[i][j] *y[i][j]。 |
8.6 向量相关函数
相关的比较运算符 (<, <=, >, >=, ==, !=) 运算后将生成Boolean结果。对于向量之间的比较运算,请使用以下内建函数。以下,“bvec”是bvec2,bvec3或bvec4之一的占位符,“ivec”是ivec2,ivec3或ivec4之一的占位符,“vec”是vec2,vec3或vec4的占位符。在所有情况下,任何特定调用的输入和返回向量的大小必须匹配。
语法 | 描述 |
bvec lessThan(vec x, vec y) bvec lessThan(ivec x, ivec y) | 逐个分量地返回x<y的结果 |
bvec lessThanEqual(vec x, vec y) bvec lessThanEqual(ivec x, ivec y) | 逐个分量地返回x<=y的结果 |
bvec greaterThan(vec x, vec y) bvec greaterThan(ivec x, ivec y) | 逐个分量地返回x>y的结果 |
bvec greaterThanEqual(vec x, vec y) bvec greaterThanEqual(ivec x, ivec y) | 逐个分量地返回x>=y的结果 |
bvec equal(vec x, vec y) bvec equal(ivec x, ivec y) bvec equal(bvec x, bvec y) bvec notEqual(vec x, vec y) bvec notEqual(ivec x, ivec y) bvec notEqual(bvec x, bvec y) | 逐个分量地返回x==y的结果 |
bool any(bvec x) | 如果x的任意分量为真,则返回真 |
bool all(bvec x) | 如果x的所有分量都为真,则返回真 |
bvec not(bvec x) | 返回x的逐个分量地补集 |
8.7 纹理查找函数
纹理查找函数可用于顶点着色器和片段着色器。但是,细节级别不是由顶点着色器的固定功能计算的,因此顶点和片段纹理查找之间的操作存在一些差异。下表中的函数通过OpenGL ES API设置,通过采样器提供对纹理的访问。OpenGL ES API调用还定义了纹理属性,如大小,像素格式,维度数,过滤方法,mip-map级别数,深度比较等。通过下面定义的内置函数访问纹理时,会考虑上述属性。
在下面的函数中,bias参数对于片段着色器来说是可选的。但在顶点着色器中不可使用。对于片段着色器,如果使用了bias这个参数,它被加到优先细节的计算级别中来执行纹理访问操作。如果bias没有使用,那么实现将自动选择一个默认级别。对于非纹理映射的纹理,纹理是直接被使用的。如果是纹理映射的,并且在片段着色器中执行,那么使用LOD来进行纹理查找。如果是纹理映射的,并且在顶点着色器中执行,那么使用的是基本纹理。
以Lod结尾的内建函数只能用在顶点着色器中,在带有Lod的函数中,lod参数直接用来表示细节级别。
语法 | 描述 |
vec4 texture2D (sampler2D sampler, vec2 coord ) vec4 texture2D (sampler2D sampler, vec2 coord, float bias) vec4 texture2DProj (sampler2D sampler, vec3 coord ) vec4 texture2DProj (sampler2D sampler, vec3 coord , float bias) vec4 texture2DProj (sampler2D sampler, vec4 coord ) vec4 texture2DProj (sampler2D sampler, vec4 coord , float bias) vec4 texture2DLod (sampler2D sampler, vec2 coord , float lod) vec4 texture2DProjLod (sampler2D sampler, vec3 coord , float lod) vec4 texture2DProjLod (sampler2D sampler, vec4 coord , float lod) | 使用纹理坐标coord 在当前绑定到 sampler的2D纹理中执行纹理查找。 对于投影(“Proj”)版本, 纹理坐标(coord.s,coord.t)除以coord 的最后一个分量。 对于vec4 coord变体,coord的第三个成分被忽略。 |
vec4 textureCube (samplerCube sampler, vec3 coord ) vec4 textureCube (samplerCube sampler, vec3 coord , float bias ) vec4 textureCubeLod (samplerCube sampler, vec3 coord , float lod) | 使用纹理坐标coord 在当前绑定到sampler的 立方体贴图纹理中执行纹理查找。 coord的方向用于选择要在哪个面进行二维纹理查找 (如OpenGL规范2.0版中的3.8.6节所述) |
版权声明:本文为flycatdeng原创文章或译文,转载请加上链接和作者名 https://blog.csdn.net/flycatdeng