Unity图形学之着色器之间传递参数
1.初始化 struct:
UNITY_INITIALIZE_OUTPUT(type,name)
Type: struct 名字
Name :变量的名字
struct Input
{
float2 uv_MainTex;
float3 myColor;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void MyVertx(inout appdata_base v,out Input o){
//宏定义 初始化struct
UNITY_INITIALIZE_OUTPUT(Input,o);
o.myColor = _Color.rgb;
}
2.顶点着色器 和片段着色器 的运算次数不是一个量级的,能放在顶点着色器里面运算的,尽量放在顶点里面运算
3.abs(v.naormal) : 法线取值是 -1到 1 ,所以abs是取绝对值 (0-1)
Shader "Custom/TestParameter"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Lambert vertex:MyVertx
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
float3 myColor;
};
half _Glossiness;
half _Metallic;
fixed4 _Color;
void MyVertx(inout appdata_base v,out Input o){
//宏定义 初始化struct
UNITY_INITIALIZE_OUTPUT(Input,o);
o.myColor = _Color.rgb * abs(v.normal);
}
void surf (Input IN, inout SurfaceOutput o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb * IN.myColor;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}