版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/coolbeliever/article/details/83214344
前面我们解释了SurfaceShader的简单的结构,其实那种结构是在Unity5.x以后才有的,unity对其做了大幅度的封装,在那之前是一种比较复杂但是比较灵活的结构,这篇博文我们来看一下:
Shader "Custom/NewSurfaceShader" {
Properties {//这里是一些属性定义,跟Shader1.0和2.0完全一样
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
//Lambert:这个是灯光的入口函数,在Unity内部已经实现好了
//finalcolor:最后一次计算像素的入口函数,一般会计算一些雾,这里我们先去掉
//vertex:这是顶点着色器的入口函数
//surface:表面着色器的入口函数,这里看成片段着色器
//#pragma surface surf Lambert finalcolor:col vertex:vert
#pragma surface surf Lambert vertex:vert
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
//顶点着色器的入口函数,一般用来改变位置
void vert(inout appdata_base v) {
v.vertex.xyz *= 2;
}
//表面着色器的入口函数,这里的第二个参数要换成SurfaceOutput,完成计算后会传递给finalColor,具体结构定义可以查看官方文档
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
FallBack "Diffuse"
}
还是老毛病,注释已经写得非常详细了,这里不再多说。细节东西后面会用例子做解释