著色器(Shader)之頂點著色器

2021-09-11 02:22:54 字數 2992 閱讀 6255

頂點著色器其實就是我們自己編寫的一段在gpu中執行的程式,有了頂點著色器,我們就可以從固定的功能流水線中代替一些模組,

從而獲得更多的頂點操作的靈活性。

對於頂點位置進行操作的的能力具有廣泛的應該場合:織物模擬、粒子系統的點尺寸處理等。

可程式設計流水線中的頂點結構比固定的流水線具有更加豐富的資料。

首先我們應該檢測一下,硬體是否支援頂點著色器:

//如果裝置支援的版本低於2.0版

if(caps. vertexshaderversion 之前使用的都是靈活頂點格式來表示頂點,在可程式設計的流水線中,我們使用比靈活頂點格式表示的內容更豐富,功能更強大的頂點宣告

我們將頂點宣告描述為乙個d3dvertexelement9型別的乙個陣列,該陣列中的沒有乙個元素都描述了乙個頂點結構的分量

所以如果你的頂點結構具有3個分量(位置,顏色,法線),則相對應的頂點宣告就可以用乙個維數為3的d3dvertexelement9型別陣列來描述

d3dvertexelement9結構定義:

typedef struct d3dvertexelement9

當前位置存放到的是法線normal,由於sizeof(pos) = 12,所以normal相對於頂點結構起始點偏移量就是12,該引數的值就是12

type 指定資料型別。該引數可取列舉型別d3ddecltype的任何乙個成員,一些常用的型別如下:

d3ddecltype_floati浮點型別的標量。

d3ddecltype_float2浮點型別的2d向量。

d3ddecltype_float3浮點型別的3d向量。

d3ddecltype_float4浮點型別的4d向量。

d3ddecltype_d3dcolor 乙個被擴充套件為rgba浮點型別顏色向量(r,g,b,a)的d3dcolor型別,

其中顏色向量的每個分量都被規範化至區間[0,]內。

method 指定了頂點分量的用途,比如:某一分量是作為位置向量,法向量還是紋理向量

主要取自下面的列舉型別:

typedef enum d3ddeclusage 

d3ddeclusage,*lpd3ddeclusage;

usageindex:該成員是乙個位於[0,15]之間的整數,當我們創造的點具有相同的分量的時候,我們可以使用該屬性來按序標記

比如:我們現在點向量裡面有4個分量:位置和3個法線

那麼我們可以按序將這3個法向量的索引分別指定為0,1,2。按照這種方式,我們那就可以通過用法索引表示每乙個特定的法向量

像下面這樣:

d3dvertexelement9 decl()=

,    ,

(0,24,d3ddecltype_float3,d3ddeclmethod_default, d3ddeclusage_normal,1),

(0,36,d3ddecltype_float3,d3ddeclmethod_default, d3ddeclusage_normal,2}, 

d3ddecl_end()

};

其中,d3ddecl_end巨集用於初始化d3dvertexelement9陣列中的最後乙個頂點元素。

一旦我們將頂點宣告為乙個d3dvertexelement9型別的陣列,我們就可以使用如下方法獲得指向介面idirect3dvertexdeclaration9的指標:

hresult createvertexdeclaration(

const d3dvertexelement9*pvertexelements,

idirect3dvertexdeclaration9**ppdec1

);

·pvertexelements 指向乙個d3dvertexelement9型別的結構陣列,該陣列描述了我們想要建立的頂點宣告。

·ppdecl 用於返回·個指向所建立的idirect3dvertexdeclaration9介面的指標。

下面是乙個該函式的呼叫例項,其中decl是乙個d3dvertexelement9型別的結構陣列。

idirect3dvertexdeclaration9*  _decl  = 0;

hr=device->createvertexdeclaration(decl,&_decl);

使用靈活頂點格式的時候,我們使用setfvf來開啟靈活頂點的使用,

現在我們使用 device->setvertexdeclaration(_decl) 即可

引數是我們的頂點宣告的建立的時候返回的指標

參考這個頂點宣告

d3dvertexelement9 decl()=

,    ,

(0,24,d3ddecltype_float3,d3ddeclmethod_default, d3ddeclusage_normal,1),

(0,36,d3ddecltype_float3,d3ddeclmethod_default, d3ddeclusage_normal,2}, 

d3ddecl_end()

};

我們需要一種方法來定義 從頂點宣告中的元素 到 頂點輸入結構成員的對映  

我們在輸入結構中通常為每乙個成員都有一種定義: vector position:position

這種定義通過 用法型別和用法索引  來標識頂點宣告中的每乙個元素。

比如:

struct vs_input 

;// 環境光強度

vector ambientlightintensity = ;

//// input and output structures.

//輸出與輸入結構

struct vs_input

;struct vs_output;//

// main

//vs_output main(vs_input input)

頂點著色器 片段著色器

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

頂點著色器與片元著色器

頂點著色器 在管線中的位置 1號 這圖作的跟病毒似的 可以替代下面這些傳統的操作 頂點變換 法線變化及規範化 紋理座標生成 紋理座標變換 光照彩色材質應用 頂點著色器可以用來指定一系列完全通用的 並將應用於各個頂點及相關資料上的操作。理解這點很重要。頂點著色器不會取代一次需要多個頂點的情況或者需要拓...

HLSL頂點著色器

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