1刃永、ShaderLab
目前面向GPU的編程有三種高級圖像語言:HLSL語言,GLSL語言吩蔑,Cg語言替裆。
HLSL語言:High Level Shading Language校辩,由Microsoft公司提供,通過Direct3D圖形軟件庫來編寫的著色器語言辆童。
GLSL語言:OpenGL Shading Language宜咒,由OpenGL安委會提供,在OpenGL中進行著色器編程的語言把鉴。
Cg語言:C for Graphics故黑,由NVIDIA公司和Microsoft公司合作提供,有自己的一套關鍵字和函數庫庭砍,獨立于三維編程接口场晶,在Direct3D和OpenGL上都可工作。
ShaderLab: Unity 自己又封裝了一層CG/HLSL/GLSL的接口怠缸,但為了實現跨平臺诗轻,Unity重點支持Cg著色器語言。所以我們使用的是ShaderLab
2揭北、渲染流程
見【Unity Shader入門精要】概念基礎
3扳炬、Shader的基本結構
看一下基本的Shader程序結構
Shader "Unlit_Tutorial_Shader"{
Properties{ //這個是告訴暴露給editor的屬性吏颖,可以再編輯器中編輯
_Color("Total Color",Color) = (1,1,1,1) //告訴編輯器我有一個屬性為Color的數據需要編輯
}
SubShader{ //每一個Shader都至少有一個SubShader
Pass{ //每個SubShader至少有一個Pass
CGPROGRAM
#pragma vertex vertexFunction //相當于聲明頂點著色器的函數入口
#pragma fragment fragmentFunction //相當于申明片元著色器的函數入口
#include "UnityCG.cginc" //有一些常用函數和常量在這個文件中
struct a2v { //頂點數據結構
float4 vertex:POSITION; //頂點位置,應該是在模型坐標系下的
float2 uv:TEXCOORD0;//第一套紋理坐標
float3 normal:NORMAL;//頂點法線恨樟,應該也是在模型坐標系下的
};
struct v2f { //傳入片元的數據結構
float4 position:SV_POSITION;//裁剪坐標系下的頂點坐標
float2 uv:TEXCOORD0;//第一套紋理UV坐標
};
float4 _Color; //在Properties聲明的_Color半醉,可以再編輯器中修改
v2f vertexFunction(a2v inValue) {//頂點著色器函數入口,要與聲明的一致
v2f o;
return o;
}
//輸出值將會存儲到渲染目標(render target)中
fixed4 fragmentFunction(v2f inValue) :SV_TARGET{ //片元著色器函數入口劝术,要與聲明一致
return _Color;
}
ENDCG
}
}
}