下面是表面着色器案例分析,主要是自己学习,其实就是抄写一遍
首先是一个比较简单的例子
Shader"Example/Diffuse"//漫反射
{
SubShader
{
Tags{"RenderType"="Opaque"}//渲染模式为透明物体,也就是场景中的透明物体使用该shader
CGPROGRAM
#pragma surface surf Lambert//内置光照模式
struct Input//输入结构体,该例子中,只有颜色值
{
float4 color:Color;
};
void surf (Input IN,inout SurfaceOutPut o)//表面函数,IN是输入结构体类型,SurfaceOutPut为输出类型,默认的
{
o.Albedo=1;//其实Albedo为float3 类型,该句的意思就是o.Albedo=(1,1,1);//全白
}
ENDCG
}
FallBack“Diffuse”//俗称备胎
}
加上纹理
Shader"Example/Diffuse Texture"
{
Properities
{
_MainTex("Texture",2D)="White"{}//注意属性中的每一行的结尾并没有顿号结束——MainTex为变量名字,Texture为在检视面板现实的名字,任意
}
SubShader
{
Tags{"RenderType"="Opaque"}//只有一个SubShader时,该行卸载;里面与外边效果是一致的,当两个SubShader时,若写外边就是说明两个SubShader都使
CGPROGRAM
#pragma surface surf Lambert
struct
{
float2 uv_MainTex;
};
Sample2D _MainTex;//该处的声明与属性一一对应
void surf (Input IN,SurfaceOutPut o)
{
o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;//漫反射贴图为在uv_MainTex坐标所对应的——MainTex图像
}
ENDCG
FallBack"Diffuse"
}
}
加上法线贴图,使纹理更有立体感,在属性中增加一个属性,即法线贴图_BumpMap("BumpMap",2D)="White"{}
在输入结构体中,将纹理坐标及法线坐标都传递近表面函数中
struct
{
float2 uv_MainTex;
float2 uv_BumpMap;
};
表面函数
void surf (Input IN,inout SurfaceOutPut o)
{
o.Albedo=tex2D(_MainTex,IN.uv_MainTex);
o.Normal=UnpackNormal(tex2D(_BumTex,IN.uv_BumpTex));
}