HLSL Effect的vertex shader和pixel shader的引數傳遞 .
下面以最簡單的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的相關初始化函式定義{
return c;
}
如上畫素著色器的float4 c : COLOR0則來自於OutputVS中的float4 color : COLOR0;
畫素著色器再輸出計算得到的每個畫素的顏色值,就是我們在螢幕看到的結果了。