4

最終編集:

解決済み...アルファブレンディングがどのように機能するかを詳しく学ぶ必要がありました。私が持っていたはずです: oBlendStateDesc.RenderTarget[a].DestBlendAlpha = D3D11_BLEND_ZERO; ...アルファを維持するには、D3D11_BLEND_ONE に設定します。

一度バックバッファにレンダリングすると、色が正常にブレンドされ、それが最終出力になるため、問題は認識されません。テクスチャにレンダリングするときも同じことが当てはまります。テクスチャをバックバッファにレンダリングすると、正しくないアルファがテクスチャをバックバッファに誤ってブレンドする役割を果たします。

その後、アルファが減少しているように見える別の問題に遭遇しました。これは、たとえば、色が 2 回ブレンドされているためです...

Source.RBGA = 1.0f, 0.0f, 0.0f, 0.5f
Dest.RGBA   = 0.0f, 0.0f, 0.0f, 0.0f

テクスチャにレンダリング...

Result.RGB = Source.RBG * Source.A +  Dest.RGB * (1 - Source.A) = 0.5f, 0.0f, 0.0f
Result.A   = Source.A * 1 + Dest.A * 1 = 0.5f

今...

Source.RBGA = 0.5f, 0.0f, 0.0f, 0.5f
Dest.RGBA   = 0.0f, 0.0f, 0.0f, 0.0f

バックバッファにレンダリング...

Result.RGB = Source.RBG * Source.A +  Dest.RGB * (1 - Source.A) = 0.25f, 0.0f, 0.0f
Result.A = Source.A * 1 + Dest.A * 1 = 0.5f

これを解決するには、テクスチャをバックバッファーにレンダリングするときに同じブレンド状態を使用しますが、SrcBlend を D3D11_BLEND_ONE に変更して、色が 2 回ブレンドされないようにします。

うまくいけば、これは同様の問題を抱えている他の誰かに役立ちます....

編集終了

パフォーマンスを向上させるために、テクスチャに変化しないテキストの文字列をレンダリングして、毎回個々の文字のレンダリングを節約しようとしています。

私は厳密に 2D でレンダリングしているので、アルファ ブレンディングを有効にしながら深度とステンシルのテストを無効にしました。

問題は、アルファ ブレンディングが発生していないように見えることです。最後に描画されたものは、現在のピクセルを独自のデータで上書きします...ブレンディングはありません。

変わらないシングルブレンド状態を使用しています。バックバッファにレンダリングすると、ブレンディングは正常に機能します。最終的なテクスチャをバックバッファにレンダリングするとき、ブレンディングも正常に機能します。ブレンドが失敗したように見えるのは、テクスチャにレンダリングしたときだけです。

単一のブレンド状態を設定する方法は次のとおりです。

D3D11_BLEND_DESC oBlendStateDesc;

oBlendStateDesc.AlphaToCoverageEnable = 0;
oBlendStateDesc.IndependentBlendEnable = 0; //set to false, dont need loop below... but just incase

for (unsigned int a = 0; a < 8; ++a)
{
oBlendStateDesc.RenderTarget[a].BlendEnable = 1;
oBlendStateDesc.RenderTarget[a].SrcBlend = D3D11_BLEND_SRC_ALPHA;
oBlendStateDesc.RenderTarget[a].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
oBlendStateDesc.RenderTarget[a].BlendOp = D3D11_BLEND_OP_ADD;
oBlendStateDesc.RenderTarget[a].SrcBlendAlpha = D3D11_BLEND_ONE;
oBlendStateDesc.RenderTarget[a].DestBlendAlpha = D3D11_BLEND_ZERO;
oBlendStateDesc.RenderTarget[a].BlendOpAlpha = D3D11_BLEND_OP_ADD;
oBlendStateDesc.RenderTarget[a].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
}

// Create the blend state from the description
HResult = m_poDevice->CreateBlendState(&oBlendStateDesc, &m_poBlendState_Default);

m_poDeviceContext->OMSetBlendState(m_poBlendState_Default, nullptr, 0xffffff);

テクスチャにレンダリングする際にブレンドを有効にするために欠けている追加の手順はありますか?

編集: AlphaToCoverageEnable を true に設定すると、ブレンドされますが、ひどく見えます。少なくとも、同じブレンド状態を使用していることを確認します...バックバッファまたはテクスチャにレンダリングするタイミングに応じて、動作が異なります:/これが私のテクスチャの説明です...

m_oTexureDesc.Width = a_oDesc.m_uiWidth;
m_oTexureDesc.Height = a_oDesc.m_uiHeight;
m_oTexureDesc.MipLevels = 1;
m_oTexureDesc.ArraySize = 1;
m_oTexureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
m_oTexureDesc.SampleDesc.Count = 1; //No sampling
m_oTexureDesc.SampleDesc.Quality = 0;
m_oTexureDesc.Usage = D3D11_USAGE_DEFAULT; //GPU writes & reads
m_oTexureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
m_oTexureDesc.CPUAccessFlags = 0;
m_oTexureDesc.MiscFlags = 0;

編集:ここにいくつかの視覚化があります... 文章

  1. バックバッファへのレンダリング - AlphaBlending が有効になっています。
  2. テクスチャへのレンダリング - AlphaBlending が有効になっています。
  3. バックバッファへのレンダリング - AlphaBlending が無効になっています。
  4. フォント ファイルから取得した文字 T

*AB を無効にしてレンダリングすると、文字が完全に一致します (4 と 3 を比較)

*AB を有効にしてバックバッファにレンダリングすると、文字はわずかに (ほとんど目立たない) 色あせてレンダリングされますが、それでもブレンドされます (4 と 1 を比較)

*AB を有効にしてテクスチャにレンダリングすると、まったくブレンドされずに、文字がさらに著しく色あせてレンダリングされます。(4 と 2 を比較)

アルファ ブレンディングを有効にすると色が白っぽくなる理由はわかりませんが、手がかりになるのではないでしょうか?

編集: レンダー ターゲット テクスチャをクリアすると... 0.0f、0.0f、1.0f、1.0f (RGBA、青)... これが結果です: ここに画像の説明を入力

アルファ > 0.0f & < 1.0f のピクセルのみが色とブレンドされます。別の手がかりですが、この問題を解決する方法がわかりません...

4

0 に答える 0