Unity Shader------顶点函数和片元函数

顶点和片元函数实现一个白色的效果

Shader "Custom/Shader01"{
	SubShader{
		Pass{
		    CGPROGRAM
			// 声明了顶点函数的函数名
            #pragma vertex vert
		    //声明了片元函数的函数名
            #pragma fragment frag
			//顶点函数(系统调用)
			/*基本作用:将顶点坐标从模型坐标系转换为剪裁面坐标系(从游戏环境转换到视野摄像机屏幕上) 每个顶点都参与计算*/
			float4 vert(float4 v: POSITION) : SV_POSITION {
		    //语义:告诉系统参数的作用
		    //POSITION语义:让系统把顶点左边传递给参数v,SV_POSITION语义:表示float4类型的返回值是剪裁空间的顶点坐标
			    return UnityObjectToClipPos(v); //矩阵相乘函数
		    }
		    //片元函数(系统调用) 
		    /*基本作用:计算并返回每一个像素的颜色值,模型对应在屏幕上的每个像素都参与计算*/
		    fixed4 frag() : SV_Target{
		    	return fixed4(1,1,1,1);
		    }
		    ENDCG
	    }
	}
	FallBack "Diffuse"
}

通过结构体传递参数,NORMAL和TEXCOORD0语义

struct s1 {
    float4 vertex : POSITION;  //告诉unity把模型空间下的顶点坐标传给vertex
    float3 normal : NORMAL;    //告诉unity把模型空间下的法线方向传递给normal
    float4 texcoord : TEXCOORD0;//告诉unity把第一套纹理坐标传递给texcoord
 };
 float4 vert(s1 v1) : SV_POSITION {
    return mul(UNITY_MATRIX_MVP,v1.vertex);
}

在顶点函数和片元函数之间传递数据(使用顶点的法线坐标作为RGB值进行渲染)

Shader "Custom/Shader01"{
	SubShader{
		Pass{
		    CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
			struct s1 {
				float4 vertex : POSITION;  //告诉unity把模型空间下的顶点坐标传给vertex
				float3 normal : NORMAL;    //告诉unity把模型空间下的法线方向传递给normal
				float4 texcoord : TEXCOORD0;//告诉unity把第一套纹理坐标传递给texcoord

            };
	        struct s2 {
				float4 position : SV_POSITION;
				float3 temp : COLOR0;
			};
			s2 vert(s1 v1){
				s2 s;
				s.position = mul(UNITY_MATRIX_MVP,v1.vertex);
				s.temp = v1.normal;
				return s;
		    }
		    fixed4 frag(s2 s) : SV_Target{
		    	return fixed4(s.temp,1);
		    }
		    ENDCG
	    }
	}
	FallBack "Diffuse"
}

渲染效果

语义

从应用程序传递到顶点函数的语义:
POSITION 顶点坐标(模型空间)
NORMAL 法线(模型空间)
TANGENT 切线(模型空间)
TEXCOORD0~n 纹理坐标
COLOR 顶点颜色
从顶点函数到片元函数的语义:
SV_POSITION 裁剪空间的顶点坐标(一般是系统自动使用)
COLOR0 传递一组值 4个
COLOR1 传递一组值 4个
TEXCOORD0~7 传递纹理坐标
片元函数传递给系统
SV_Target 显示到屏幕上的颜色

发布了107 篇原创文章 · 获赞 31 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/103752689