GLSL shader语言用于OpenGL、HLSL shader语言用于DirectX、ShaderLab用于unity。1.表面着色器 surface shader 2.定点/片元着色器 vexter/fragment
1.Shader的基本结构。
shader由名字,属性,一个或多个SubShader,后备方案四部分组成。
Shader "Yanzi/myshader"{ Properties{ //属性 _Color("_Color",Color) = (0.5,0.6,0.6,1) _Vector("Vector",Vector) = (1,2,3,4) _Int("Int",Int) = 12324 _Float("Float",Float) = 4.5 _Range("Range",Range(1,11)) = 6 _2D("Texture",2D) = "red"{} _Cube("Cube",Cube) = "white" {} //_3D{"texture",3D}="blue"{} } //SubShader可以有多个 SubShader{ //至少有一个Pass Pass{ //在这里编写shader代码 HLSLPROGRAM CGPROGRAM //使用CG语言编写Shader float4 _Color; //float half fixed 颜色一般用fixed存储,因为fixed位数是-2到2; float3 t1; float2 t2; float4 _Vector; float _Int; float _Float; float _Range; sampler2D _2D; samplerCube _Cube; sampler3D _3D; ENDCG } } Fallback "VertexLit" //后备方案 }
2.顶点/片元着色器
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Yanzi/02-secondshader"{ SubShader{ Pass{ CGPROGRAM #pragma vertex vert //顶点函数 基本作用:完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境转换到视野相机屏幕上) #pragma fragment frag //片元函数 基本作用:返回模型对应的屏幕上的每一个像素的颜色值 float4 vert(float4 v:POSITION) :SV_POSITION { //通过语义告诉系统,我这个参数是干嘛的,比如POSITION是告诉系统我需要顶点坐标 //SV_POSITION这个语义是用来解释说明返回值,意思是返回值是剪裁空间下的顶点坐标 return UnityObjectToClipPos(v); } fixed4 frag():SV_Target { return fixed4(0.5f,0.5f,1,1); } ENDCG } } Fallback"VertexLit" }
3.片元函数和顶点函数之间的数据传递
从应用程序传递到顶点函数的语义有哪些
POSITION 顶点坐标(模型空间下的)/ NORMAL 法线(模型空间下的)/ TANGENT 切线(模型空间下的)/ TEXCOORD0~n 纹理坐标 / COLOR 顶点颜色
从顶点函数传递到片元函数的语义
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)/ COLOR0 可以传递一组值、四个值,并不单指颜色 / COLOR1 传递四个值 / TEXCOORD0~7 传递纹理坐标
片元函数传递给系统
SV_Target 颜色值,显示在屏幕上的颜色