unity shader lightDir
时间: 2025-02-25 07:53:24 浏览: 33
### Unity Shader 中光照方向的实现
在 Unity 的 Shader 编程中,处理光照方向是一个常见的需求。为了确保光照效果自然逼真,通常需要考虑光源的位置以及物体表面法线的方向。
当涉及到具体实现时,在顶点着色器中计算光线方向是非常重要的一步。对于方向光而言,由于其特性表现为平行光线,因此可以通过特定的方式简化计算过程:
```c
// 定义全局变量用于存储方向光的信息
uniform float4 _DirectionalLightColor;
uniform float3 _DirectionalLightDir;
v2f vert (appdata_t v)
{
v2f o;
// 将顶点坐标从对象空间转换至裁剪空间
o.pos = UnityObjectToClipPos(v.vertex);
// 计算世界空间下的法向量并传递给片段着色器
o.normal = mul(float4(v.normal,0), unity_WorldToObject).xyz;
// 获取当前像素的世界位置
float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
// 使用观察空间中的光源位置
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz); // 对于方向光来说就是简单的归一化
o.lightDir = lightDir;
return o;
}
```
上述代码展示了如何在一个自定义的顶点着色器函数 `vert` 内部获取和准备光照方向的数据[^1]。这里 `_WorldSpaceLightPos0` 是由 Unity 自动提供的内置变量之一,代表了场景内第一个方向光的方向矢量[^3]。
接着,在片段着色器部分,则可以根据之前传入的光照方向来进行进一步的颜色计算:
```c
fixed4 frag (v2f i) : SV_Target
{
fixed3 normal = normalize(i.normal);
// Diffuse component calculation using N dot L formula
half NdotL = max(0,dot(normal,i.lightDir));
fixed3 diffuse = NdotL * _DirectionalLightColor.rgb;
return fixed4(diffuse,1.0);
}
```
这段代码实现了基本的漫反射光照模型,通过计算法线与光照方向之间的夹角余弦值(即N·L),进而影响最终颜色输出强度[^2]。
阅读全文
相关推荐


















