最简单的Shader
Shader "MyShader/FirstShader"{
SubShader{
pass {
CGPROGRAM
//顶点函数 这里只是声明了定点函数的函数名
//把模型空间坐标转换到 剪裁空间
#pragma vertex vert
//片元函数
//返回模型在屏幕中每个像素的颜色值
#pragma fragment frag
float4 vert(float4 v : POSITION) : sv_POSITION //通过语义告诉系统参数是干嘛的
{ //sv_POSITION : 返回值是剪裁空间下的定点坐标 POSITION:参数为顶点坐标
return UnityObjectToClipPos(v); //模型空间坐标转换成剪裁空间坐标
}
fixed4 frag() : sv_Target
{ //sv_Target : 返回值为颜色
return fixed4(1,1,1,1);
}
ENDCG
}
}
Fallback "VertexLit"
}
为了接收更多unity输入,比如:法线,贴图。需要使用结构体
Shader "MyShader/SecondShader"
{
Properties
{
_Color("Color",Color) = (0,0,0,0)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//只有在CGPROGRAM内再次定义一个与属性块名字类型相同的变量,属性块才起作用
fixed4 _Color;
struct a2v
{
float4 vertex : POSITION; //模型顶点填充v
float3 normal : NORMAL;
};
struct v2f
{
float4 vertex : SV_POSITION; //告诉Unity pos 为裁剪空间位置信息
fixed3 color : COLOR0;
};
v2f vert(a2v v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
//将-1到1区间转变为0到1
o.color = v.normal*0.5+fixed3(0.5,0.5,0.5);
return o;
};
fixed4 frag(v2f i) : SV_Target
{
fixed3 c = i.color;
c*=_Color.rgb;
return fixed4(c,1);
}
ENDCG
}
}
}
使用Shader库中的输入输出结构体
需要添加语句#include “UnityCG.cginc”
例如输入结构体
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
vert修改参数为appdata_base 显示效果不变
v2f vert(appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
//将-1到1区间转变为0到1
o.color = v.normal*0.5+fixed3(0.5,0.5,0.5);
return o;
};
输出结构体
struct v2f_img
{
float4 pos : SV_POSITION;
half2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
总结
顶点着色器输入结构中常用语义
顶点着色器输出结构体中常用语义
片元着色器输出时常用语义