Unity Shader------顶点函数和片元函数
程序员文章站
2024-03-23 08:19:13
...
顶点和片元函数实现一个白色的效果
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 显示到屏幕上的颜色
上一篇: Spring基础入门笔记
下一篇: HDFS JAVA API操作