您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何進行HLSL Effect的vertex shader和pixel shader的參數傳遞,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
HLSL基本以C語言的習慣來寫的,但是如果完全以C語言的角度來看,我個人感覺入門最難理解就是頂點著色器和像素著色器的兩個函數的參數傳遞了。
下面以最簡單的HLSL中效果框架舉例說下自己的理解。
uniform extern float4x4 gWVP;
struct OutputVS
{
float4 posH : POSITION0;
float4 color : COLOR0;
};
OutputVS ColorVS(float3 posL : POSITION0, float4 c : COLOR0)
{
// Zero out our output.
OutputVS outVS = (OutputVS)0;
// Transform to homogeneous clip space.
outVS.posH = mul(float4(posL, 1.0f), gWVP);
// Just pass the vertex color into the pixel shader.
outVS.color = c;
// Done--return the output.
return outVS;
}
float4 ColorPS(float4 c : COLOR0) : COLOR
{
return c;
}
technique ColorTech
{
pass P0
{
// Specify the vertex and pixel shader associated with this pass.
vertexShader = compile vs_2_0 ColorVS();
pixelShader = compile ps_2_0 ColorPS();
}
}
首先是定義的OutputVS,這里是作為頂點著色器的輸出,先不用管。看頂點著色器函數里面的參數: OutputVS ColorVS(float3 posL : POSITION0, float4 c : COLOR0) { } 相比C語言函數,最讓初學者疑惑的是里面兩個參數float3 posL : POSITION0, float4 c : COLOR0是哪里傳進來的?其實這兩個參數是固定的由Directx的pipeline傳進來的。在Directx中我們都會定義我們的頂點格式以及為其注冊,如下: //============================================================ //先在Directx的相關初始化函數定義我們的頂點格式 struct VertexCol { VertexCol():pos(0.0f, 0.0f, 0.0f),col(0x00000000){} VertexCol(float x, float y, float z, D3DCOLOR c):pos(x,y,z), col(c){} VertexCol(const D3DXVECTOR3& v, D3DCOLOR c):pos(v),col(c){} D3DXVECTOR3 pos; D3DCOLOR col; static IDirect3DVertexDeclaration9* Decl; }; D3DVERTEXELEMENT9 VertexColElements[] = { {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, {0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, D3DDECL_END() }; HR(gd3dDevice->CreateVertexDeclaration(VertexColElements, &VertexCol::Decl)); //============================================================= //然后在調用IDirect3DDevice9::Draw**()之類函數之前告知Directx我們的頂點格式。 HR(gd3dDevice->SetVertexDeclaration(VertexCol::Decl)); //================================================================ 這樣我們在D3DVERTEXELEMENT9里面定義的頂點成分{……D3DDECLUSAGE_POSITION, 0}就會傳遞給頂點著色器參數中的float3 posL : POSITION0, 而和{……D3DDECLUSAGE_COLOR, 0}就傳給頂點著色器參數中的float4 c : COLOR0。 頂點著色器計算好后得到每個像素的OutputVS,輸出到像素著色器中。 //============================= float4 ColorPS(float4 c : COLOR0) : COLOR
{
return c;
}
如上像素著色器的float4 c : COLOR0則來自于OutputVS中的float4 color : COLOR0;
像素著色器再輸出計算得到的每個像素的顏色值,就是我們在屏幕看到的結果了。
以上就是如何進行HLSL Effect的vertex shader和pixel shader的參數傳遞,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。