溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行HLSL Effect的vertex shader和pixel shader的參數(shù)傳遞

發(fā)布時間:2021-10-14 14:21:47 來源:億速云 閱讀:175 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關(guān)如何進行HLSL Effect的vertex shader和pixel shader的參數(shù)傳遞,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

  HLSL基本以C語言的習(xí)慣來寫的,但是如果完全以C語言的角度來看,我個人感覺入門最難理解就是頂點著色器和像素著色器的兩個函數(shù)的參數(shù)傳遞了。

  下面以最簡單的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,這里是作為頂點著色器的輸出,先不用管??错旤c著色器函數(shù)里面的參數(shù):   OutputVS ColorVS(float3 posL : POSITION0, float4 c : COLOR0)   {   }   相比C語言函數(shù),最讓初學(xué)者疑惑的是里面兩個參數(shù)float3 posL : POSITION0, float4 c : COLOR0是哪里傳進來的?其實這兩個參數(shù)是固定的由Directx的pipeline傳進來的。在Directx中我們都會定義我們的頂點格式以及為其注冊,如下: //============================================================ //先在Directx的相關(guān)初始化函數(shù)定義我們的頂點格式   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)); //============================================================= //然后在調(diào)用IDirect3DDevice9::Draw**()之類函數(shù)之前告知Directx我們的頂點格式。    HR(gd3dDevice->SetVertexDeclaration(VertexCol::Decl)); //================================================================   這樣我們在D3DVERTEXELEMENT9里面定義的頂點成分{……D3DDECLUSAGE_POSITION, 0}就會傳遞給頂點著色器參數(shù)中的float3 posL : POSITION0, 而和{……D3DDECLUSAGE_COLOR, 0}就傳給頂點著色器參數(shù)中的float4 c : COLOR0。   頂點著色器計算好后得到每個像素的OutputVS,輸出到像素著色器中。   //=============================   float4 ColorPS(float4 c : COLOR0) : COLOR

  {

      return c;

  }

 如上像素著色器的float4 c : COLOR0則來自于OutputVS中的float4 color : COLOR0;

 像素著色器再輸出計算得到的每個像素的顏色值,就是我們在屏幕看到的結(jié)果了。

以上就是如何進行HLSL Effect的vertex shader和pixel shader的參數(shù)傳遞,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI