Shader "Custom/Surface_Shadeer" {
Properties { //属性
_Color ("主颜色", Color) = (1,1,1,1)
_MainTex ("主纹理", 2D) = "white" {}
_NormalTex ("法线纹理", 2D) = "" {}
}
//子着色器
SubShader {
Tags { "RenderType"="Opaque" } //标签
LOD 200 //多层次细节 高效渲染的运算
//开始CG着色器编程语言段 surface 固定格式
CGPROGRAM
//1.光照模式声明:使用兰伯特光照模式 surface 固定格式 声明为表面着色器 Lamber是漫反射光照模式
#pragma surface surf Lambert
//2.输入结构 主要是用来接收外部的数据
struct Input
{
//四元素的颜色值(RGBA)
float4 color : COLOR;
float2 uv_MainTex;//uv + 变量名称 就可以获取当前的uv点 可以直接使用 是一个固定的结构
};
sampler2D _MainTex; //声明一张贴图
float4 _MainColor; //声明主颜色
sampler2D _NormalTex; //声明法线贴图
//3.表面着色函数的编写实现方法
void surf (Input IN, inout SurfaceOutput o) {
//反射率 float3 表示三维变量 floa4表示四维变量
// o.Albedo = float3(0.5,0.8,0.3); //(0.5,0.8,0.3)分别对应于RGB分量
//而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
//改变着色器颜色
o.Albedo = _MainColor.rgb;
//给当前着色器贴图赋值 四维颜色转三维RGB
o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;
//给当前着色器的法线赋值 首先获取到法线贴图的颜色输出值tex2D(_NormalTex, IN.uv_MainTex) 但是需要把颜色输出值转换成法线向量赋值给着色器 也就是赋值给 o.Normal
o.Normal = UnpackNormal(tex2D(_NormalTex, IN.uv_MainTex));
}
ENDCG //结束CG着色器编程语言段
}
FallBack "Diffuse" //备用渲染方式 “”里面填的内容为Shader的路径
}
注:此着色器与unity 3d 本身预制的光照进行计算 ,Lambert和BlinnPhong,或者是自定义的光照模型 ,void surf (Input IN,inout SurfaceOutput 0)是其重要的显示实现函数,作用是接收 struct Input 函数的UV等数据的输入,进行处理,然后将结果填充显示在SurfaceOutput中。