函数说明
abs-取绝对值acos-反余弦函数acosh-反双曲余弦函数all-返回一个bool值,指示是否所有的值都为真any-返回一个bool值,指示是否有任何一个值为真asin-反正弦函数asinh-反双曲正弦函数atan-反正切函数atanh-反双曲正切函数ceil-向上取整clamp-将值限制在指定的范围内cos-余弦函数cosh-双曲余弦函数cross-计算向量叉积dFdx-返回一个向量或标量的x分量的导数dFdy-返回一个向量或标量的y分量的导数degrees-将弧度转换为角度determinant-计算矩阵的行列式distance-计算两个向量之间的距离dot-计算两个向量的点积equal-检查两个参数是否相等exp-计算自然指数函数的值exp2-计算2的幂次方faceforward-返回表面法线朝向floatBitsToInt-将浮点数转换为带符号整数floatBitsToUint-将浮点数转换为无符号整数floor-返回小于等于输入值的最大整数fract-返回输入值的小数部分fwidth-返回函数对输入值的x和y方向导数的绝对值之和gl_FragCoord-获取像素坐标信息gl_FragDepth-获取像素深度值gl_FrontFacing-判断面的方向gl_InstanceID-获取实例IDgl_PointCoord-获取点的纹理坐标gl_PointSize-获取点的大小gl_Position-获取顶点位置gl_VertexID-获取顶点IDgreaterThan-比较两个向量的大小greaterThanEqual-比较两个向量的大小intBitsToFloat-转换整型位表示的浮点数为单精度浮点数inverse-求逆矩阵inversesqrt-求倒数的平方根isinf-判断浮点数是否为正或负无穷大isnan-判断浮点数是否为NaNlength-返回向量长度lessThan-逐元素比较两个向量并返回bool向量lessThanEqual-逐元素比较两个向量并返回bool向量,小于或等于返回truelog-计算以e为底的对数log2-计算以2为底的对数matrixCompMult-Matrix元素逐一相乘max-返回两个数的较大值min-返回两个数的较小值mix-线性混合两个值mod-计算浮点数除法的余数modf-返回浮点数的整数和小数部分normalize-向量单位化not-按位求反notEqual-按位不等outerProduct-向量外积packHalf2x16-将两个浮点数压缩成半精度packSnorm2x16-将两个浮点数压缩成符号化半精度packUnorm2x16-将两个浮点数压缩成无符号半精度pow-幂函数radians-角度转弧度reflect-计算反射向量refract-计算折射向量round-四舍五入roundEven-根据奇偶性舍入sign-符号函数sin-正弦函数sinh-双曲正弦函数smoothstep-平滑阶梯函数sqrt-平方根step-阶梯函数tan-正切函数tanh-双曲正切函数texelFetch-获取纹素的颜色值texelFetchOffset-获取偏移量纹素的颜色值texture-对纹理进行采样textureGrad-对纹理进行采样,包括Mipmap层级计算textureGradOffset-对纹理进行采样,包括Mipmap层级计算和偏移量textureLod-根据给定的Mipmap层级对纹理进行采样textureLodOffset-根据给定的Mipmap层级和偏移量对纹理进行采样textureOffset-对纹理进行采样,包括偏移量textureProj-对投影纹理进行采样textureProjGrad-对投影纹理进行采样,包括Mipmap层级计算textureProjGradOffset-对投影纹理进行采样,包括Mipmap层级计算和偏移量textureProjLod-根据给定的Mipmap层级对投影纹理进行采样textureProjLodOffset-根据给定的Mipmap层级和偏移量对投影纹理进行采样textureProjOffset-对投影纹理进行采样,包括偏移量textureSize-获取纹理的尺寸transpose-矩阵转置trunc-向零舍入取整uintBitsToFloat-将32位无符号整数解释为浮点数unpackHalf2x16-解压缩单精度浮点数unpackSnorm2x16-解压缩单精度浮点数unpackUnorm2x16-解压缩单精度浮点数

GLSL函数文档:faceforward()

函数说明

faceforward() 函数用于判断向量朝向,它可以通过比较入射向量与几何法线的方向,是否一致确定向量朝向。

函数原型

bvec2 faceforward(bvec2 N, bvec2 I, bvec2 Nref);
bvec3 faceforward(bvec3 N, bvec3 I, bvec3 Nref);
bvec4 faceforward(bvec4 N, bvec4 I, bvec4 Nref);

参数解释

N:几何法线向量,即法向量。

I:入射向量。

Nref:法线参考向量。可以理解为“参照物”,通常为表面法线向量。

返回值

返回一个Boolean类型的向量。

函数操作

  • 如果 $\text{dot}(\boldsymbol{N},\boldsymbol{Nref}) > 0$,则表示向量 $\boldsymbol{I}$ 从背面进入。
  • 如果 $\text{dot}(\boldsymbol{N},\boldsymbol{Nref}) < 0$,则表示向量 $\boldsymbol{I}$ 从正面进入。

返回值为一个具有两个或三个分量的 Boolean 向量。

示例

示例1

vec3 normal = normalize(normalMatrix * a_normal);
vec3 lightDir = normalize(light.position - v_position);

if (dot(normal, lightDir) < 0.0) {
    normal = -normal;
}

vec3 diffuse = max(dot(normal, lightDir), 0.0) * u_material.diffuse.rgb;

在这个示例中,我们使用 dot() 函数来计算法线向量和光源方向向量之间的夹角。如果这个夹角小于 0,就意味着光线从物体的背面照射到表面上。我们可以使用 faceforward() 函数来修正这个问题。

示例代码:

vec3 normal = normalize(normalMatrix * a_normal);
vec3 lightDir = normalize(light.position - v_position);

normal = faceforward(normal, -lightDir, normal);

vec3 diffuse = max(dot(normal, lightDir), 0.0) * u_material.diffuse.rgb;

在这个示例中,我们使用了 faceforward() 函数来判断入射方向,如果被照射物体的法向量与光线方向相反,则法向量取反。

示例2

vec3 norm = normalize(N);
vec3 toLight = normalize(u_lightPos - v_worldPos);
vec3 toEye = normalize(u_eyePos - v_worldPos);

vec3 reflection = reflect(-toLight, norm);

// 计算菲涅耳反射
float fresnel = pow(clamp(1.0 - dot(toEye, reflection), 0.0, 1.0), 5.0);

vec4 fragColor = mix(texture(tex, v_texcoord), vec4(u_color, 1.0), fresnel);

在这个示例中,我们使用了 reflect() 函数来计算反射向量。但是,在某些情况下,反射向量的方向可能与表面法向量相反,我们可以使用 faceforward() 函数来解决这个问题。

示例代码:

vec3 norm = normalize(N);
vec3 toLight = normalize(u_lightPos - v_worldPos);
vec3 toEye = normalize(u_eyePos - v_worldPos);

vec3 reflection = reflect(-toLight, norm);
reflection = faceforward(reflection, -toEye, norm);

// 计算菲涅耳反射
float fresnel = pow(clamp(1.0 - dot(toEye, reflection), 0.0, 1.0), 5.0);

vec4 fragColor = mix(texture(tex, v_texcoord), vec4(u_color, 1.0), fresnel);

在这个示例中,我们使用了 faceforward() 函数来保证反射向量的方向与表面法向量一致。