1 3怎麼寫HLSL著色器

2021-04-12 18:15:49 字數 2769 閱讀 7442

1.3

怎麼寫

hlsl

著色器

我們可以直接把

hlsl

著色器**作為一長串字串編寫進我們的應用程式原始檔中,但是,更加方便和模組化的方法是把著色器的**從應用程式**中分離出來。因此,我們將著色器**單獨儲存為文字格式,然後在應用程式中使用特定函式將其載入進來。

下面是乙個完整的

hlsl

著色器程式**,我們把它儲存在

basichlsl.txt

中。該著色器完成頂點的世界變換、觀察變換和投影變幻,並將頂點顏色設定為指定的顏色。

//// basichlsl.txt

////

// global variable

//matrix wvpmatrix;

vector color;

//// structures

//struct vs_input

;struct vs_output;//

// functions

//vs_output setcolor(vs_input input)

下面就針對上述**講解一下

hlsl

著色器程式的編寫:

1.3.1

全域性變數

**中宣告了兩個全域性變數:

matrix wvpmatrix;

vector color;

變數wvpmatrix

是乙個矩陣型別,它包含了世界、觀察、投影的合矩陣,用於對頂點進行座標變換;

變數color

是乙個向量型別,它用於設定頂點顏色;

**中並沒有對全域性變數進行初始化,這是因為我們對全域性變數的初始化過程將在應用程式中進行,全域性變數在應用程式中賦值而在著色器程式中使用,這是應用程式和著色器通訊的關鍵所在。具體賦值過程將在後續部分講述。

1.3.2

輸入輸出

²輸入輸出結構

程式中定義了兩個輸入輸出結構

vs_input

和vs_output

struct vs_input

;struct vs_output

;自定義的結構可以採用任意名稱,結構不過是一種組織資料的方式,並不是強制的,你也可以不使用,而將本程式的輸入改為:

vector position : position; ²

標誌符用於輸入輸出的變數採用用一種特殊的宣告方式:

type variablename : semantic

這個特殊的冒號語法表示乙個語義,冒號後面的標誌符用來指定變數的用途,如

vector position : position;

其中,position

標誌符表明該變數表示頂點位置,另外還有諸如

color

、normal

等很多表示其他意義的標誌符。

本節所說的輸入輸出其實是指著色器**和編譯器、

gpu之間的通訊,和應用程式是無關的,所以這些變數不需要在應用程式中進行賦值,標誌符告訴編譯器各個輸入輸出變數的用途(頂點位置、法線、顏色等),這是著色器**和編譯器、

gpu之間通訊的關鍵。

1.3.3

入口函式

程式中還定義了乙個函式

setcolor

:output setcolor(input input)

1.該函式以

input

和output

型別作為輸入輸出;

2.使全域性變數

wvpmatrix

和input.position

相乘,以完成頂點的世界、觀察、投影變換,並把結果賦值到

output.position

;output.position = mul(input.position, wvpmatrix);

3.將全域性變數

color

的值賦給

output.color

;output.color = color;

4.在同乙個著色器**檔案中,可以有多個使用者自定義函式,因此在應用程式中需要指定乙個入口函式,相當於

windows

程式的winmain

函式,本程式只包含

setcolor

乙個函式而且它將被做為入口函式使用。

1.3.4

總結至此,乙個

hlsl

著色器編寫完畢,渲染過程中,當乙個頂點被送到著色器時:

1.全域性變數

wvpmatrix

、color

將在應用程式中被賦值;

2.入口函式

setcolor

被呼叫編譯器根據標誌符將頂點資訊填充到

vs_input

中的各個字段;

3.setcolor

函式中,首先定義乙個

vs_output

資訊,之後根據

wvpmatrix

和color

變數完成頂點的座標變換和顏色設定操作,最後函式返回

vs_output

結構;4.

編譯器將會再次根據標誌符把返回的

vs_output

結構中的各欄位對映為頂點相應的資訊。

5.頂點被送往下乙個流程接受進一步處理。

上述過程中,全域性變數在應用程式中賦值而在著色器程式中使用,這是應用程式和著色器通訊的關鍵所在;標誌符告訴編譯器各個輸入輸出變數的用途(頂點位置、法線、顏色等),這是著色器**和編譯器、

gpu之間通訊的關鍵。個人認為這是著色器中最為精義的地方:)

HLSL頂點著色器

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

著色器(Shader)之畫素著色器

畫素著色器實際上就是對每乙個畫素進行光柵化的處理期間,在gpu上運算的一段程式。不同與頂點著色器,畫素著色器不會以軟體的形式來模擬畫素著色器。畫素著色器實質上是取代了固定功能流水線中多重紋理的環節,而且賦予了我們訪問單個畫素以及訪問每乙個畫素紋理座標的能力 多重紋理就是我們同時啟用多層紋理,然後規定...

OpenGL ES 著色器 片斷著色器詳解

opengl es 入門 01 opengl es 入門 02 opengl es 入門 03 opengl es 入門 04 opengl es 入門 05 opengl es 入門練習 01 opengl es 入門練習 02 opengl es 入門練習 03 opengl es 入門練習 0...