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" }
  • 如果有多个参数,可以定义一个结构体,拿到需要的参数

 

posted @ 2020-09-07 11:28  密斯塔Joe  阅读(263)  评论(0)    收藏  举报