目录
一、unityshader简单制作
1.顶点/片元着色器
基本结构
shader ”MyShader“ {//命名
Properties{
Name{"display name",PropertyType}=DefaultValue//属性名字:Name 显示名字:display name 类型:PropertyType 默认值:DefaultValue
}
SubShader{
[Tags]//可选的标签,仅可在subshadeer中声明
Tags{"TagName1"="Value1" "TagName2"="Value2" }
[RenderSetup]//可选的状态,Cull、ZTest、ZWrite、Blend
Pass{
[Name]
Name "MyPassName"
[Tags]//LightMode/RequireOptions
[RenderSetup]
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
//UsePass 使用其他shader中的Pass,UsePass ”MyShader/MYPASSNAME“
//GrabPass负责抓取屏幕并将结果存储在一张纹理中
Fallback “name” / Fallback Off
}
顶点/片元着色器简单代码
Pass{
CGPROGRAM
#pragma vertex vert//哪个告诉unity,哪个函数包含了顶点着色器的代码:vert
#pragma fragment frag
float4 vert(float4 v :POSITION):SV_POSITION{//把模型顶点坐标填充到输入参数v,SV_POSITION告诉unity顶点着色器的输出是裁剪空间中的顶点坐标
return mul (UNITY _MATRIX_MVP,v);//顶点坐标从模型空间转换到裁剪空间,模型观察投影矩阵
}
fixed4 frag():SV_Target{//没有输入,输出是 fixed4 类型变量使用SV_Target语义限定,将用户的输出颜色存储到一个渲染目标中
return fixed4 (1.0,1.0,1.0,1.0);//表示白色的变量
}
ENDCG
}
结构体与模型数据
Pass{
CGPROGRAM
#pragma vertex vert//哪个告诉unity,哪个函数包含了顶点着色器的代码:vert
#pragma fragment frag
struct a2v{
float4 vertex:POSITION;//POSITION告诉unity用模型空间的顶点坐标填充vertex
float3 normal:NORMAL;//NORMAL告诉unity用模型空间的法线方向填充normal
float4 texcoord:TEXCOORD0;//TEXCOORD0告诉unity用模型的第一套纹理坐标填充texcoord
}
float4 vert(a2v v):SV_POSITION{//SV_POSITION告诉unity顶点着色器的输出是裁剪空间中的顶点坐标
return mul (UNITY _MATRIX_MVP,v.vertex;//v.vertex来访问模型空间的顶点坐标
}
fixed4 frag():SV_Target{//没有输入,输出是 fixed4 类型变量使用SV_Target语义限定,将用户的输出颜色存储到一个渲染目标中
return fixed4 (1.0,1.0,1.0,1.0);//表示白色的变量
}
ENDCG
}
顶点着色器和片元着色器间的通信
Pass{
CGPROGRAM
#pragma vertex vert//哪个告诉unity,哪个函数包含了顶点着色器的代码:vert
#pragma fragment frag
struct a2v{
float4 vertex:POSITION;//POSITION告诉unity用模型空间的顶点坐标填充vertex
float3 normal:NORMAL;//NORMAL告诉unity用模型空间的法线方向填充normal
float4 texcoord:TEXCOORD0;//TEXCOORD0告诉unity用模型的第一套纹理坐标填充texcoord
}
struct v2f{
float4 pos:SV_POSITION;
fixed3 color:COLOR0;
}