Shader——顶点片元和我的第一个shader

顶点片元着色器
- 控制灵活,但不能参与光照运算
- 在着色器中插入Cg代码,编写在CGPROGRAM与ENDCG之间
- 编译指令:#pragma控制着色器代码编译
- #pragma vertex name将名称为name的函数编译为顶点着色器
- #pragma fragment name 将名为name的函数编译成片元着色器
- 参数与返回值由语义修饰
常用语义修饰
- POSITION:位置
- TANGENT:切线
- NORMAL:法线
- TEXCOORD0:第一套纹理
- TEXCOORD1:第二套纹理
- TEXCOORD2:第三套纹理
- TEXCOORD3:第四套纹理
- COLOR:颜色
创建一个简单shader
Shader "Custom/MyShader1" {
Properties {
//在面板中直接显示,并且能修改值
_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{
Pass{
CGPROGRAM//插入CG代码的开始
#pragma vertex my_vertex //作为顶点shader的入口
//这是一个入口,作用:获取上一个工序的position,对于如何获取上一个工序的结果,涉及CG的语义bind,xxx:xxx,pos:POSITION ->输入
//如果不绑定,不能获取上一工序的结果.float4(x,y,z,w)
//并且,该函数的返回值将流向下一个工位,也需要进行语义绑定float4 my_vertex(float4 pos:POSITION):POSITION{} ->输出
float4 my_vertex(float4 pos:POSITION):POSITION{
return UnityObjectToClipPos(pos);//变换
}
#pragma fragment my_frag//定义像素着色器入口(上色) fixed4:存放颜色数据
fixed4 my_frag():COLOR{
return fixed4(1.0, 0.0, 0.0, 1.0); //返回值流向下一工位
}
ENDCG//插入CG代码结束
}
}
FallBack "Diffuse"
}
注意:
- 在pass里面,需要有CG的开始和结束
- #pragma ***定义顶点shader和像素shader的入口
- 入口需要继承上一个工位的参数才能使用,同样返回值的作用是传给下一工位(语义绑定)
- 在5.6以后的版本,需要定义一个结构体才能进行语义绑定,传入一个结构体,修改其值后再返回出去
* 扩展:使用定义的变量
要想使用显示面板上的变量,需要在CG开始的时候定义跟变量名一样的变量
Shader "Custom/MyShader1" {
Properties {
//在面板中直接显示,并且能修改值
_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{
Pass{
CGPROGRAM//插入CG代码的开始
fixed4 _Color;//这里必须定义和上面一样的名字
sampler2D _MainTex;
struct my_struct()
{
int a;
};
#pragma vertex my_vertex //作为顶点shader的入口
//这是一个入口,作用:获取上一个工序的position,对于如何获取上一个工序的结果,涉及CG的语义bind,xxx:xxx,pos:POSITION ->输入
//如果不绑定,不能获取上一工序的结果.float4(x,y,z,w)
//并且,该函数的返回值将流向下一个工位,也需要进行语义绑定float4 my_vertex(float4 pos:POSITION):POSITION{} ->输出
float4 my_vertex(float4 pos:POSITION):POSITION{
return UnityObjectToClipPos(pos);//变换
}
#pragma fragment my_frag//定义像素着色器入口(上色) fixed4:存放颜色数据
fixed4 my_frag(float2 uv:TEXCOORD0):COLOR{//这里需要语义绑定,拿到纹理
//return fixed4(1.0, 0.0, 0.0, 1.0); //返回值流向下一工位
//return _Color;
return tex2D(_MainTex,uv)
}
ENDCG//插入CG代码结束
}
}
FallBack "Diffuse"
}
- 如果有多个参数,可以定义一个结构体,拿到需要的参数

浙公网安备 33010602011771号