1、将法向量和光向量从顶点函数vert移动到片段函数frag
Shader "Custom/f_diffuse" {
SubShader{
pass {
tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
#include "lighting.cginc"
struct v2f {
float4 pos:POSITION;
float3 normal:NORMAL;
float3 lightDir:COLOR;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//o.normal = normalize(v.normal);
o.normal = UnityObjectToWorldNormal(v.normal);
o.lightDir = normalize(WorldSpaceLightDir(v.vertex));
return o;
}
fixed4 frag(v2f IN) :COLOR{
//Ambient color
fixed4 col= UNITY_LIGHTMODEL_AMBIENT;
//Diffuse Color
//dot(n,l)确定漫反射的强度问题
float diffuseScale = saturate(dot(IN.normal,IN.lightDir));
col += _LightColor0*diffuseScale;
return col;
}
ENDCG
}
}
}
着色后的效果:右边的小球是自定义着色器
2、
顶点程序是基于顶点的,模型当中有一个顶点,就会启动一个顶点程序,有两个顶点,就会对两个顶点都同时并行地进行处理。当顶点程序计算出结果,传递给片断程序frag,片断程序会进行光栅化处理。这个特性利用了显卡底层的特性。能够把三角形面片分割为每一个像素点。一个片断程序对应于一个像素的处理,一个三角形会分割为很多的小像素,而我们总是对同一个三角形的那一片数据使用了相同的法向量和光向量,对于三角形分割较少,在顶点中使用了相同的数据,由这些数据分割出来的像素使用的是同样的数据在frag中,在frag中起不到差值分割的目的。所以获取法向量和光向量放在顶点程序中是错误的,应该放在片段程序当中。
o.lightDir = normalize(WorldSpaceLightDir(v.vertex));
光滑度基本上和左侧默认的shader一致
放大也没有出现斑块问题: