0x04.Shader函数pow
在Shader编程里,pow
函数是一个很重要的数学函数,通常用于计算一个数的指定次幂。下面将从函数定义、语法、示例及使用场景这几个方面来详细介绍。

Shader "ShaderLearning/Shader10"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
fixed4 frag(v2f i) : SV_Target
{
float r = pow(i.uv.x * i.uv.x, 0.3) + pow(i.uv.y * i.uv.y, 0.3) - 1;
return fixed4(r, 0, 0, 1);
}
ENDCG
}
}
}
函数定义
pow
函数的主要作用是计算一个数的指定次幂,也就是将一个数(底数)乘以自身若干次,次数由另一个数(指数)决定。
语法
在不同的Shader语言中,pow
函数的语法基本一致。以GLSL(OpenGL Shading Language)为例,其语法如下:
float pow(float x, float y);
vec2 pow(vec2 x, vec2 y);
vec3 pow(vec3 x, vec3 y);
vec4 pow(vec4 x, vec4 y);
- 第一个参数
x
是底数。 - 第二个参数
y
是指数。 - 函数返回值是
x
的y
次幂。该函数支持对float
、vec2
、vec3
和vec4
类型进行操作,当输入为向量时,会对向量的每个分量分别进行幂运算。
示例
以下是一个简单的GLSL片段着色器示例,展示了 pow
函数的使用:
#version 330 core
out vec4 FragColor;
void main()
{
// 计算 2 的 3 次幂
float result = pow(2.0, 3.0);
FragColor = vec4(result, result, result, 1.0);
}
在这个示例中,pow(2.0, 3.0)
计算了 2 的 3 次幂,结果为 8.0。然后将该结果赋值给颜色向量的每个分量,最终输出的颜色是 (8.0, 8.0, 8.0, 1.0)
。
使用场景
- 光照计算:在光照模型里,
pow
函数可用于模拟高光反射。例如,在Phong光照模型中,计算高光项时会用到pow
函数来控制高光的强度和范围。 - 颜色校正:在进行颜色校正或者对比度调整时,
pow
函数能对颜色值进行非线性变换,从而实现颜色的调整。 - 纹理映射:在纹理映射过程中,
pow
函数可用于调整纹理的透明度或者颜色强度,使纹理的显示效果更加自然。