Unity Shader 之 dot
简介
在Unity Shader编程中,dot操作(点积)是一个非常重要的数学运算。它主要用于计算两个向量之间的夹角,或者判断两个向量的方向关系。点积运算在光照计算、法线处理、阴影生成等Shader效果中都有广泛应用。
原理
点积的数学定义是两个向量对应分量相乘后再相加。在Shader中,我们可以使用内置的dot函数来计算两个向量的点积。点积的结果可以反映两个向量的方向关系:
- 如果点积大于0,表示两个向量的方向大致相同
- 如果点积等于0,表示两个向量垂直
- 如果点积小于0,表示两个向量的方向大致相反
应用
- 光照计算:通过计算表面法线和光照方向的点积,可以得到光照强度
- 法线贴图:使用点积计算切线空间和世界空间的转换
- 阴影生成:通过点积判断表面是否处于阴影区域
- 边缘检测:利用点积计算相邻面的法线夹角,实现边缘高亮效果
示例
下面是一个简单的Shader代码示例,展示了如何使用dot操作计算漫反射光照:
Shader "Custom/DiffuseShader" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : SV_POSITION;
float3 worldNormal : NORMAL;
};
v2f vert (appdata v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
return o;
}
fixed4 frag (v2f i) : SV_Target {
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
float diff = max(0, dot(i.worldNormal, lightDir));
return fixed4(diff, diff, diff, 1.0);
}
ENDCG
}
}
}
在这个示例中,我们使用dot操作计算了表面法线和光照方向的点积,得到了漫反射光照强度,并将其作为最终输出颜色。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Beyond Lightcone!






