Unity3D之Shader入门

mac2025-08-23  7

基本属性

Shader "test/test1"{ Properties{ //属性 _Color("Color",Color) = (1,1,1,1) _Vector("Vector",Vector) = (1,2,3,4) _Int("Int",Int) = 34234 _Float("Float",Float) = 4.5 _Range("Range",Range(1,11)) = 6 _2D("Texture",2D) = "red"{} _Cube("Cube",Cube) = "white"{} _3D("Texure",3D) = "black"{} } //SubShader可以写很多个 显卡运行效果的时候,从第一个SubShader开始,如果第一个SubShader里面的效果都可以实现,那么就使用第一个SubShader,如果显卡这个SubShader里面某些效果它实现不了,它会自动去运行下一个SubShader SubShader{ //至少有一个Pass Pass{ //在这里编写shader代码 HLSLPROGRAM CGPROGRAM //使用CG语言编写shader代码 float4 _Color; //float half fixed //fixed4 float3 t1;// half3 fixed3 float2 t;//half2 fixed2 float t2; float4 _Vector; float _Int; float _Float; float _Range; sampler2D _2D; samplerCube _Cube; sampler3D _3D; //float 32位来存储 //half 16位 -6万 ~ +6万 //fixed 11位 -2 到 +2,一般颜色直接用fixed,颜色0-1 ENDCG } } Fallback "VertexLit" }

定点函数、片元函数

Shader "test/test2"{ SubShader{ //至少有一个Pass Pass{ //在这里编写shader代码 HLSLPROGRAM CGPROGRAM //顶点函数 这里只是声明了,顶点函数的函数名 //基本作用是 完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境转换到视野相机屏幕上) #pragma vertex vert //片元函数 这里只是声明了,片元函数的函数名 //基本作用 返回模型对应的屏幕上的每一个像素的颜色值 #pragma fragment frag float4 vert(float4 v : POSITION) :SV_POSITION{//通过语义告诉系统,我这个参数是干嘛的, 比如POSITION是告诉系统我需要顶点坐标 //SV_POSITION这个语义用来解释说明返回值, 意思是返回值是剪裁空间下的顶点坐标 //float4 pos = mul(UNITY_MATRIX_MVP,v); //通过矩阵进行转换 //return pos; return UnityObjectToClipPos(v); } fixed4 frag() :SV_Target{ return fixed4(0.5,0.5,1,1); } ENDCG } } Fallback "VertexLit" }

使用Struct

Shader "Siki/03 Use struct"{ SubShader{ Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag //application to vertex 应用到定点 struct a2v { float4 vertex:POSITION;//告诉unity把模型空间下的顶点坐标填充给vertex float3 normal:NORMAL;//告诉unity把模型空间下的法线方向填充给normal float4 texcoord : TEXCOORD0;//告诉unity把第一套纹理坐标填充给texcoord }; struct v2f { float4 position:SV_POSITION; float3 temp:COLOR0;//这个语义可以由用户自己定义,一般都存储颜色 }; v2f vert(a2v v) { v2f f; f.position = mul(UNITY_MATRIX_MVP,v.vertex); f.temp = v.normal; return f; } fixed4 frag(v2f f) :SV_Target{ return fixed4(f.temp,1); } ENDCG } } Fallback "VertexLit" }

最新回复(0)