頂點函式是在每個頂點被傳送到gpu之前被呼叫一次。它的作用是從模型座標系中得到三維座標,然後再轉換到其渲染到螢幕時在螢幕座標系中的二維位置。因此,通過頂點函式,我們可以修改頂點的位置、顏色和uv座標。一旦我們完成了對頂點的修改後,就會進入到surf函式的執行。與頂點函式是逐頂點執行的方式不同,surf函式則是逐畫素執行的。
通過頂點函式,我們可以創造像海上的波浪、旗幟飄動的動態效果,或者使用shader來給頂點著色。這一篇,我們來學習如何在乙個su***ce shader中建立乙個最簡單的頂點函式!
首先,我們要準備乙個已經給頂點著色過的模型,以便我們可以在頂點函式中檢視頂點顏色。為了方便,我們使用本書自帶資源(見文章開頭)中第七章的模型資源——vertexcolorobject.fbx。我們把vertexcolorobject.fbx匯入unity,並拖入到乙個新的場景中。最後新增乙個平行光。
新建乙個shader和material,可以分別命名為******vertexcolor,並將shader賦給material,再將material賦給模型。
你的場景應該看起來是這樣的:
下面,我們開始編寫shader。
在properties塊中新增新的properties:
properties為properties中新新增的屬性新增對應的引用:
float4 _maintint;
下面是很重要的input結構。我們新增了乙個新的變數vertcolor以便surf函式可以訪問vert函式中傳遞的資料:
struct最後,我們使用從input中得到的資料填充su***ceoutput結構體的albedo引數:input
;
void完整**如下:surf (input in, inout su***ceoutput o)
shader 「custom/******vertexcolor」效果如下:subshader
lod
200cgprogram
#pragma su***ce surf lambert vertex:vertfloat4 _maintint;
struct
input
;input o)
void
surf (input in, inout su***ceoutput o)
endcg
} fallback 「diffuse」
}
通過頂點函式,我們可以修改頂點的位置、顏色、uv座標等值。在本節中我們使用了乙個從maya匯入的已給頂點著色的模型,但我們可以發現,在使用預設材質的情況下這些顏色在unity中是不顯示的。我們需要編寫shader,提取這些顏色再在模型上顯示出來。
我們首先通過在#pragma宣告中新增vertex:vert語句。這實際上告訴unity,嘿,不要用你自己內建的頂點函式訪問模型頂點資訊啦,去我寫的shader裡找乙個名叫vert的傢伙,用它去處理資訊!如果unity沒有找到,它就會報乙個編譯錯誤。
你還可以發現,vertcolor是乙個float4型別的變數,這意味著我們還可以訪問它的透明通道。像下面這樣:
void surf (input in, inout su***ceoutput o)
修改OGRE中的模型頂點色
我想修改模型的頂點。在以前dx的開發經歷中,鎖定頂點緩衝後改頂點色是很容易的。但是在ogre中,我卻沒有成功實現。設定模型的頂點色 voidcd3deffect fun setmodecolor dwordvcolor else hardwarevertexbuffersharedptrdsthvb...
15 通過索引訪問頂點資料
1.繪製立方體 使用gl.drawarrays方法以gl.s方式繪製需要定義36個頂點,以gl.fan繪製需要24個頂點,但是需要呼叫6次drawarrays方法。webgl提供了解決方案 gl.drawelements api gl.drawelements mode,count,type,off...
自動計算頂點緩衝中所有頂點的法線
問題 當繪製自定義的結構時,你會發現光照不正確。這是因為你沒有指定正確的法線向量,顯示卡要求每個頂點都有法線資訊,這樣它才可以決定每個三角形獲得多少光照,詳細資訊可見第六章。為每個頂點計算法線向量看起來很複雜,因為大多數頂點被多個三角形共享。如果每個頂點只被乙個三角形使用,你只需找到三角形的法線向量...