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 颜色值,显示在屏幕上的颜色