3

本質的に2Dコンテキストで複数のテクスチャクワッド(画像)をレンダリングするアプリケーションがありますが、これは正常に機能しています。ただし、一部のテクスチャの一部が透明になるように変更した後、一見標準的で理論的に単純な方法で動作させることをやめました。テクスチャを順番に描画するだけです(これまでのように) )、およびテクスチャに透明なピクセルがある場合、それらのスポットに以前に描画されたものをすべて表示します。

ただし、代わりに実行しているのは、レンダリングターゲットの以前にレンダリングされた部分ではなく、透明なセクションの背後に、以前に描画された各テクスチャのスケーリングされたバージョンを表示することです。したがって、たとえば、不透明な背景テクスチャを描画してから、完全に透明な小さなテクスチャを描画しようとすると、背景はきれいに描画されますが、透明な画像には、新しい透明な画像のサイズ/位置に合わせて背景全体が拡大縮小されて表示されます。

後続のレンダリングされたテクスチャはこの方法で続行され、前にレンダリングされたテクスチャが最終的にどのように表示されたを示します(前のテクスチャの要素を含む)。

DirectXのテクスチャ/ピクセルシェーダーがどのように機能するかについての基本的な何かが明らかに欠けています(私は比較的新しいので、これは驚くことではありません)が、オンラインですべてを読んだ後、私は調べて、無数の方法で実験することができました、私はまだ私が何をする必要があるのか​​理解できません。

ピクセルシェーダーで1つのテクスチャを使用していますが、これは問題の一部である場合とそうでない場合があります。シーンをレンダリングするたびに、レンダリングするすべてのテクスチャをループし、PSSetShaderResources()を呼び出して、異なるテクスチャをそのピクセルシェーダーテクスチャにバインドします。ループごとに、変更するたびにDrawIndexed()を呼び出します。ピクセルシェーダーに任意のテクスチャを使用させることができない場合(プリコンパイルする必要があります)、シェーダーテクスチャを大量に使用することは意味がないため、これは効果的な方法のようです。いいえ?)。

とにかく、私よりも知識のある人が自分の間違いにすぐに気付くのに十分な症状になることを願っています。これらの領域のコードは非常に単純ですが、いくつかのセクションを含めることもできます。

これまでのシーン、各シェーダーRVについて:

        m_pd3d11ImmDevContext->PSSetShaderResources(0, 1, &shaderRV);
        m_pd3d11ImmDevContext->DrawIndexed( ... )

シェーダー:

Texture2D aTexture : register(t0);

SamplerState samLinear : register(s0);

struct VS_INPUT
{
    float3 position  : POSITION;
    float3 texcoord0 : TEXCOORD0;
};

struct VS_OUTPUT
{
    float4 hposition : SV_POSITION;
    float3 texcoord0 : TEXCOORD0;
};

struct PS_OUTPUT
{
    float4 color : COLOR;
};

// vertex shader
VS_OUTPUT CompositeVS( VS_INPUT IN )
{
    VS_OUTPUT OUT;

    float4 v = float4( IN.position.x,
                       IN.position.y,
                       0.1f,
                       1.0f );

    OUT.hposition = v; 
    OUT.texcoord0 = IN.texcoord0;
    OUT.texcoord0.z = IN.position.z ;

    return OUT;
}

// pixel shader
PS_OUTPUT CompositePS( VS_OUTPUT IN ) : SV_Target
{
    PS_OUTPUT ps;

ps.color = aTexture.Sample(samLinear, IN.texcoord0);

return ps;
}

ブレンドの説明の設定(問題がここにあるとは思わないでください):blendDesc.RenderTarget [0] .BlendEnable = true;

    blendDesc.RenderTarget[0].SrcBlend      =  D3D11_BLEND_SRC_ALPHA;
    blendDesc.RenderTarget[0].DestBlend     =  D3D11_BLEND_INV_SRC_ALPHA;
    blendDesc.RenderTarget[0].BlendOp       =  D3D11_BLEND_OP_ADD;
    blendDesc.RenderTarget[0].SrcBlendAlpha =  D3D11_BLEND_ZERO;
    blendDesc.RenderTarget[0].DestBlendAlpha=  D3D11_BLEND_ZERO;
    blendDesc.RenderTarget[0].BlendOpAlpha  =  D3D11_BLEND_OP_ADD;

他のコードセグメントが役立つかどうか教えてください!

4

0 に答える 0