D3D12渲染技術之畫素著色器
再介紹一下片段著色器,在光柵化期間,從頂點著色器(或幾何著色器)輸出的頂點屬性在三角形的畫素上進行插值, 然後將插值作為輸入,輸入到畫素著色器。 假設沒有幾何著色器,下圖說明了到目前為止頂點資料的路徑。
每個頂點元素都有一個由D3D12_INPUT_ELEMENT_DESC陣列指定的相關語義,頂點著色器的每個引數也具有附加的語義, 語義用於將頂點元素與頂點著色器引數進行匹配。 同樣地,頂點著色器的每個輸出都具有附加的語義,並且每個畫素著色器輸入引數具有附加的語義。 這些語義用於將頂點著色器輸出對映到畫素著色器輸入引數。 畫素著色器就像頂點著色器,因為它是為每個畫素片段執行的函式, 給定畫素著色器輸入,畫素著色器的作用是計算畫素片段的顏色值。 我們注意到畫素片段可能無法存活並使其進入後緩衝區; 例如,它可能被裁剪在畫素著色器中(HLSL包括可以丟棄進一步處理的畫素片段的裁剪功能),被另一個具有較小深度值的畫素片段遮擋,或者畫素片段可能被稍後丟棄 管道測試就像模板緩衝測試一樣。 因此,後緩衝器上的畫素可以具有多個畫素片段候選;這是“畫素片段”和“畫素”的含義之間的區別,儘管有時這些術語可以互換使用,但上下文通常會明確其含義。 下面是一個簡單的畫素著色器,它對應於前面部落格中給出的頂點著色器。 為完整起見,再次顯示頂點著色器。
cbuffer cbPerObject : register(b0)
{
float4x4 gWorldViewProj;
};
void VS(float3 iPos : POSITION, float4 iColor : COLOR,
out float4 oPosH : SV_POSITION,
out float4 oColor : COLOR)
{
// Transform to homogeneous clip space.
oPosH = mul(float4(iPos, 1.0f), gWorldViewProj);
// Just pass vertex color into the pixel shader.
oColor = iColor;
}
float4 PS(float4 posH : SV_POSITION, float4 color : COLOR) : SV_Target
{
return pin.Color;
}
在此示例中,畫素著色器僅返回插值顏色值, 請注意,畫素著色器輸入與頂點著色器輸出完全匹配,這是一項要求。 畫素著色器返回4D顏色值,函式引數列表後面的SV_TARGET語義指示返回值型別應與渲染目標格式匹配。 我們可以使用輸入/輸出結構重寫上面的頂點和畫素著色器, 符號的不同之處在於我們將語義附加到輸入/輸出結構的成員,並且我們使用return語句來輸出而不是輸出引數。
cbuffer cbPerObject : register(b0)
{
float4x4 gWorldViewProj;
};
struct VertexIn
{
float3 Pos : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn vin)
{
VertexOut vout;
// Transform to homogeneous clip space.
vout.PosH = mul(float4(vin.Pos, 1.0f), gWorldViewProj);
// Just pass vertex color into the pixel shader.
vout.Color = vin.Color;
return vout;
}
float4 PS(VertexOut pin) : SV_Target
{
return pin.Color;
}
關於畫素著色器的介紹都是最基礎的,上面介紹的也是最基礎的,希望讀者能夠掌握。