頂點色的訪問

2021-09-06 21:23:47 字數 1799 閱讀 4352

頂點函式是在每個頂點被傳送到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

;

最後,我們使用從input中得到的資料填充su***ceoutput結構體的albedo引數:

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...

自動計算頂點緩衝中所有頂點的法線

問題 當繪製自定義的結構時,你會發現光照不正確。這是因為你沒有指定正確的法線向量,顯示卡要求每個頂點都有法線資訊,這樣它才可以決定每個三角形獲得多少光照,詳細資訊可見第六章。為每個頂點計算法線向量看起來很複雜,因為大多數頂點被多個三角形共享。如果每個頂點只被乙個三角形使用,你只需找到三角形的法線向量...