2つのレンダーターゲットビューがあります。バックバッファーと、特殊なマスクを表すTexture2Dです(必要なものにステンシルバッファーを使用できません)。私のレンダリングメソッドはおおよそ次のようになります。
// clear the render target and depth stencil views, set render targets,
// update subresources, set vertex buffers, topology, input layout, etc.
// draw to the back buffer and the mask
m_d3dContext->PSSetShader(m_pixelShader1.Get(), nullptr, 0);
m_d3dContext->IASetIndexBuffer(m_indexBuffer1.Get(), DXGI_FORMAT_R16_UINT, 0);
m_d3dContext->DrawIndexed(m_indexCount1, 0, 0);
// read from the mask and draw to the back buffer
m_d3dContext->PSSetShader(m_pixelShader2.Get(), nullptr, 0);
m_d3dContext->IASetIndexBuffer(m_indexBuffer2.Get(), DXGI_FORMAT_R16_UINT, 0);
m_d3dContext->DrawIndexed(m_indexCount2, 0, 0);
PixelShader1は次のようになります(入力構造体とその他の部分を省略):
struct PixelShaderInput
{
float4 Color : COLOR;
float2 Texture : TEXCOORD;
};
struct PixelShaderOutput
{
float4 Color : SV_TARGET0;
float4 Mask : SV_TARGET1;
};
PixelShaderOutput main(PixelShaderInput input)
{
PixelShaderOutput output;
output.Color.rgba = input.Color;
output.Mask.rgba = float4(1, 0, 0, 1);
return output;
}
PixelShader2は次のようになります。
struct PixelShaderInput
{
float3 Color : COLOR0;
float2 Texture : TEXCOORD0;
float4 Mask : COLOR1;
};
struct PixelShaderOutput
{
float4 Color : SV_TARGET0;
};
PixelShaderOutput main(PixelShaderInput input)
{
PixelShaderOutput output;
// do some work with input.Texture
if (input.Mask.x == 0)
{
output.Color = float4(0, 0, 0, 1); }
}
else
{
output.Color = float4(1, 1, 1, 1);
}
return output;
}
Visual Studioのグラフィックデバッグツールを使用すると、マスクテクスチャがPixelShader1によって正しく書き込まれていることがわかります。フレームの終わりに、正しい位置に表示される赤いジオメトリがあります。さらに、バックバッファへの出力(外観は異なります)も期待どおりです。ですから、PixelShader1は正しいと強く信じています。
ただし、PixelShader2から予期しない結果が得られます。それをステップスルーすると、input.Mask.xの値はいたるところにあります。他のすべてのピクセルシェーダーがそれらを設定するので、それらは1または0のいずれかであると予想されますが、代わりに値はテクスチャ座標に非常によく似ています。
それで、まず第一に、私がやろうとしていることは可能でさえありますか?もしそうなら、誰かが私がCOLOR1を読んでいる方法で私のエラーを見つけることができますか?私はこれに何時間も困惑しているので、どんな助けでも大歓迎です。
私はDirectX11、シェーダーモデル4.0レベル9_1、およびvc110で作業しています。