天天看點

unity 定點着色器輸入值

unity shader有3中類型,分别是固定着色器,頂點片段着色器和表面着色器,

固定着色器固定功能着色器為固定功能渲染管線的具體表現,功能較簡單相容比較老的機器基本都快被淘汰了。

表面着色器是對定點片源着色器的封裝,封裝了好多建立的光照模型,降低shader的書寫門檻,但是不友善了解shader實作原理。

定點和片段着色器,顧名思義是由定點着色器和片段着色器組成的,靈活度比較高,但是需要有一定的CG基礎,片段着色器輸入内容是由定點着色器提供的,這裡主要說一下頂點着色器的輸入。

頂點着色器輸入的結構體語義包含:

POSITION:頂點的位置,通常為float3或float4 類型;
TANGENT:頂點法線向量,通常為float3類型;
NORMAL:切線向量(通常用在法線貼圖中),通常為float4 類型;
TEXCOORD0:第一UV坐标,通常為float2,(TEXCOORDx紋理坐标,如果用float4類型存儲,x、y、z分量如果沒有值,預設是0,w分量預設為1)
TEXCOORD1:第二UV坐标
TEXCOORD2:第三UV坐标
TEXCOORD3:第四UV坐标
COLOR:每一個頂點的顔色值,通常為float4 類型;
           

position,tangent,normal,color比較好了解,就是定點的屬性值,但是這個TEXCOORD的東西,困擾了我好久,什麼是第一UV坐标,什麼是第二UV坐标呢?由于自己不會模組化,是以今天特意查了相關資料才明白一點兒,這個TEXCOORD其實和模型mesh的uv是對應的,

unity 定點着色器輸入值

這個mesh屬性裡面可以看到它包含了uv和uv2,3d軟體在導出模型的mesh的時候,是可以包含多個通道uv資訊的,常見的模型一般都是單uv通道類型的,uv包含的是貼圖在模型上面的對應位置資訊

unity 定點着色器輸入值

uv2比較特殊,uv2則主要是用來存儲光照貼圖用的紋理坐标用的,當勾選模型的generate lightmap uvs,進行烘焙的時候,如果mesh的uv2為空,unity會為mesh建立新的uv2,如果已經存在,則會用光照貼圖去填充該紋理坐标,也就是說unity的光照貼圖會自動占用uv2通道。

unity 定點着色器輸入值

如果了解了mesh的uv,uv2,在來看shader輸入語義中的TEXCOORD0,TEXCOORD1就容易了解了,TEXCOORD0就是模型頂點貼圖的空間坐标,TEXCOORD1就是模型頂點光照貼圖的空間坐标。

回顧一下unity渲染管線:參考 https://blog.csdn.net/u012722551/article/details/104276327

在應用階段,擷取模型的定點資料,定點着色器輸入的值都是從模型上面讀取的

幾何階段,定點資料傳入到定點着色器,在由定點着色器進行資料轉換,和部分邏輯處理,通過結構體傳送到片段着色器,定點着色器操作對象是定點,片段着色器操作對象是三個定點構成的像素面,逐像素進行處理然後輸出該像素點的顔色。

空間變換:模型空間-世界空間-觀察空間-裁剪空間:參考https://my.oschina.net/u/918889/blog/1858627

Unity的Shader中,頂點着色器輸入的值所對應的空間是模型空間,語義為POSITION,

UnityObjectToClipPos 方法實作了從模型坐标空間,轉變為裁剪空間的操作。

unity 定點着色器輸入值

繼續閱讀