时常看看
001 拿到顶点法线
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal: NORMAL; //【S1】定义---------------使用关键字 NORMAL,计算光照需要用到模型法线
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
// 计算光照需要用到法线和世界位置
float3 worldNormal: TEXCOORD1; //【S1】定义---------------使用关键字 TEXCOORD1
//------------------> 【疑问】 为什么一会用”NORMAL" , 一会儿用“TEXCOORD(n)” ,是因为在不同的渲染阶段吗?
//【我的理解】: 在应用程序阶段,即在appdata中,NORMAL 是关键字, Unity会识别,将模型的“法线”赋值给“声明的变量 normal”
float3 worldPos:TEXCOORD2;
};
v2f vert (appdata v) //你只管定义好”结构体“ , 传入是Unity的”ShaderLab“识别并执行的
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
//【S2】向下传输这些数据 , ------------------------------拿到法线
o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
//漫反射
//【S3】使用--------------------------------------- 得到顶点法线
float3 normal = normalize(i.worldNormal);
// 得到光照方向
float3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);
......
}
002 拿到光照方向
// 得到光照方向
float3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);
本文详细介绍了在Unity Shader中如何通过顶点法线和光照方向进行光照计算的过程。包括了如何定义和传递顶点法线及世界位置到片段着色器,并解释了使用不同关键字的原因。
487

被折叠的 条评论
为什么被折叠?



