2

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で作業しています。

4

1 に答える 1

1

PixelShader2 の記述方法にいくつかの概念が間違っています。PixelShader1 は、2 つのレンダー テクスチャに Color と Mask の値を書き込みます。PixelShader 2 では、頂点入力としてではなく、テクスチャからこれらの値を読み取る必要があります。

Texture2D<float4> MaskTexture;
SamplerState MaskSampler;

struct PixelShaderInput
{
    float3 Color   : COLOR0;
    float2 Texture : TEXCOORD0;
};

struct PixelShaderOutput
{
    float4 Color : SV_TARGET0; 
};

PixelShaderOutput main(PixelShaderInput input)
{
    PixelShaderOutput output; 

    // do some work with input.Texture

    float maskValue = MaskTexture.Sample(MaskSampler, Texture).x;

    if (maskValue == 0)
    {
        output.Color = float4(0, 0, 0, 1);
    }
    else
    {
        output.Color = float4(1, 1, 1, 1); 
    }

    return output;
}

そのためには、SetShaderResources() を介して ShaderResource として MaskTexture (これは PixelShader1 からの 2 番目のレンダー ターゲット出力です) を渡す必要があります。また、SamplerState を作成し、それを SetSamplerStates() を介してデバイスに設定する必要もあります。

于 2013-03-15T03:57:47.597 に答える