Directx11 頂點著色器示例

2021-08-29 03:14:44 字數 2124 閱讀 4354

以下是乙個簡單的頂點著色器實現

cbuffer cbperobject

;void vs(float3 iposl : position,

float4 icolor : color,

out float4 oposh : sv_position,

out float4 ocolor : color)

著色器是由hlsl(高階著色語言)編寫的,語法與c++非常相似。著色器通常編寫在特效檔案(.fx)中。

頂點著色器函式叫做vs。注意你可以見頂點著色器命名為任何有效的函式名。這個頂點著色器有四個引數,前兩個為輸入引數,後兩個為輸出引數。hlsl沒有引用和指標,所以為了從乙個函式中返回多個值,你需要使用結構體或者輸出引數。

前兩個輸入引數構成頂點著色器的輸入簽名並對應著我們的自定義結構體中的資料成員。引數的語義「:position」和「:color」的作用是對映頂點結構體中的元素和頂點著色器中的引數,如下圖所示。

輸出引數同樣附加了語義(「:sv_postion」和「:"color」)。他們的作用是將頂點著色器的輸出對映到下個階段相應的輸入(幾何著色器或者畫素著色器)。注意語義sv_postion是特殊的(sv表示系統值)。它用於表示儲存頂點位置的頂點著色器輸出元素。頂點位置的處理方式和其他頂點屬性是不同的,因為它涉及到其它屬性未涉及到的操作,比如說裁剪。非系統值的輸出引數的語義名可以是任何有效的語義名。

vs函式的第一行通過將位置乘以4*4的矩陣gworldproj,將區域性空間轉換為齊次裁剪空間(投影空間)。

建構函式語法 float4(iposl,1.0f)構造了乙個值為float4(iposl.x,iposl.y,iposlz,1.0f)的4維向量;因為我們知道頂點是乙個點而不是向量,所以向量的第四個值為1。float2和float3型別分別表示2d和3d向量。矩陣變數gworldviewproj存在乙個常數緩衝區中。內建的函式mul用來做矩陣乘法。

vs函式的最後一行將輸入的顏色複製到輸出的引數中,這樣顏色就能輸入到管線的下一階段。

除了使用輸出引數,我們也可以將之前的頂點著色器重寫為返回值和輸入簽名都為結構體的形式。

cbuffer cbperobject

;struct vertexin

;struct vertexout

;vertexout vs(vertexin vin)

在上面的例子中,頂點著色器的前部分都有如下**

cbuffer cbperobject

;

這段**定義了乙個叫做cbperobject的常量緩衝區的物件。常量緩衝區是能儲存不同變數資料的記憶體塊,這些資料可以被著色器訪問。在本例中,常量緩衝區儲存了乙個叫做gworldview的4*4矩陣,表示世界矩陣、觀察矩陣和投影矩陣的結合矩陣(相乘)。這個結合矩用於將區域性空間轉換到齊次裁剪空間(投影空間)。在hlsl中,乙個4*4矩陣為內建的float4x4型別;常量緩衝區中的常量在每個頂點是不變的,但通過特效框架,c++應用**可以在執行時更新常量緩衝區中的內容。這為c++應用**和特效**提供了一種通訊的方式。例如,每乙個物件的世界矩陣都不同,結合矩陣不同。因此,在使用前述的頂點著色器繪製多個物體時,在繪製物體之前,需要更新變數gworldviewproj。

一般來說,建議常量緩衝區的建立應該基於你更新它們內容的頻率。例如,你可能建立如下常量緩衝:

cbuffer cbperobject

;cbuffer cbperframe

;cbuffer cbrarely

;

在這個例子中,我們用到三個常量緩衝區。第乙個常量緩衝區儲存了世界、觀察和投影矩陣的結合矩陣。該變數取決於具體的物件,所以它必須根據每個物件來進行更新。換句話說,如果我們每幀要渲染100個物件,那麼我們就需要在每幀更新該變數100次。第二個常量緩衝區儲存了場景的光照變數。此處我們假設光照是動畫的,所以需要在動畫的每一幀都需要更新。最後乙個常量緩衝區儲存的變數用於控制霧。此處,我們假設場景的霧幾乎不變。

將常數緩衝區分開的動機是效率。當乙個常量緩衝區更新,它的全部變數都會更新,因此,根據更新頻率來進行分組是非常高效的,可以最小化多餘的更新。

頂點著色器 片段著色器

一 著色器 著色器只是一種把輸入轉化為輸出的程式。著色器也是一種非常獨立的程式,因為它們之間不能相互通訊 它們之間唯一的溝通只有通過輸入和輸出。在最簡配置下,至少都得有兩個著色器 乙個叫頂點著色器 vertex shader 它將作用於每個頂點上 另乙個叫片段著色器 fragment shader ...

Shader 學習03 頂點著色器

shader hidden 3 shader2.0 subshader struct v2f v2f 頂點著色器的輸出值 片段著色器的輸入值 sampler2d maintex v2f 頂點著色器的輸出值 片段著色器的輸入值 fixed4 frag v2f i sv target endcg uni...

HLSL頂點著色器

1.在文字檔案裡編寫頂點著色器 hlsl語言 2.編譯著色器 d3dxcompileshaderfromfile 3.建立頂點著色器 createvertexshader 4.獲取hlsl語言中變數控制代碼 getconstantbyname 5.根據控制代碼給hlsl語言中的變數傳值 id3dxc...