表面着色器是通过Unity给我们制定好的一套标准,计算出需要填充输入什么,输出什么等相关信息,并产生真实的顶点(vertex)&像素(pixel)着色器,以及把渲染路径传递到正向或延时渲染路径。
输出结构
struct SurfaceOutput
{
half3 Albedo; //反射率,也就是纹理颜色值(r,g,b)
half3 Normal; //法线,法向量(x, y, z)
half3 Emission; //自发光颜色值(r, g,b)
half Specular; //镜面反射度
half Gloss; //光泽度
half Alpha; //透明度
};
我们需要做的就是对结构提供的变量进行赋值,赋值示例:
void surf (Input IN, inout SurfaceOutput o)
{
//从主纹理获取rgb颜色值
o.Albedo= tex2D (_MainTex, IN.uv_MainTex).rgb;
//从凹凸纹理获取法线值
o.Normal= UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
//从_RimColor参数获取自发光颜色
halfrim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission= _RimColor.rgb * pow (rim, _RimPower);
}
最基本的表面着色器
Shader "Custom/BasicSurfaceShader"
{
SubShader
{
Tags { "RenderType"="Opaque" }//大多数不透明着色器。
LOD 200
CGPROGRAM
#pragma surface surf Lambert //1、光照模式声明:使用兰伯特光照模式
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float4 color : COLOR;
};
fixed4 _Color;
void surf (Input IN, inout SurfaceOutput o)
{
//反射率
o.Albedo = float3(0.5, 0.8, 0.3);//(0.5,0.8,0.3)分别对应于RGB分量
}
ENDCG
}
FallBack "Diffuse"
}
网友评论