Unity中的shader腳本,是用叫做shaderlab的腳本語言來寫。這個unity中的shader不只是DX中HLSL寫的頂點和像素shader,而應該說是對應着
DX中的Effect腳本,定義了一個完整渲染的狀態。
一個文件,只能包含一個unity的shader
shader文件的內容:
簡單的一個shader的內容框架大致如下:
shader "shader name"
{
properties
{
_Color("Diffuse Color", Color) = (1,.5,.5,1)
_Texture("Main Texture", 2D) = ""{}
}
SubShader
{
Tags{"Queue"="Transparent"}
pass
{
Tags{}
Material{}
}
}
Fallback ""
}
框架看上去非常簡潔,大致的功能也從字面意思上面就可以理解。
properties 中定義的變量,是可以暴露出來給編輯器編輯的,在unity編輯器中選中一個材質,材質中的shader里面定義在properties
中的變量就會出現該材質的屬性面板中,可以手動設置對應的屬性。其中,紋理屬性后面,還有一些可選的屬性可以設置,用於設置紋理的坐標,和其他一些屬性。
當使用頂點shader的時候,該屬性標記的紋理坐標無效。
一個SubShader相當於DX中的技術,一個shader中可以出現多個subshader。在引擎渲染物體的時候,會在shader中找到第一個可以匹配硬件的SubShader,用於渲染。
如果一個都沒有找到,則用 Fallback 中的shader來渲染物體。
Tags 標記。SubShader 和 pass都有自己的標記。先來說說SubShader的Tags,這個Tags是用來告訴引擎該什么時候渲染該物體。一般在渲染引擎中,
渲染物體順序為 背景物體->不透明物體->透明物體->UI。Unity給了幾個保留的關鍵字,Background, Geometry, Transparent,Overly.也就對應着背景,不透明,透明,UI。
在內部,這幾個關鍵字都對應着一個數值Background = 1000, Geometry = 2000, Transparent = 3000,Overly = 4000。所以,我們也可以把tag這樣寫:
Tags{"Queue"="Geometry + 1"}
這代表着該物體時在不透明物體渲染之后,透明物體渲染之前被渲染。