私はDirectX10の初心者です。現在、Direct10 アプリケーションを開発しています。ユーザーの入力に従って手動で塗りつぶされた 2 つのテクスチャを混合します。現在の実装は
- D3D10_USAGE_STAGING を使用して 2 つの空のテクスチャを作成します。
- シェーダーが必要とするため、ピクセル シェーダーにバインドする 2 つのリソース シェーダー ビューを作成します。
- CopyResource を呼び出して、テクスチャを GPU メモリにコピーします。
問題は、最初のテクスチャしか見えず、2 番目のテクスチャが見えないことです。バインディングが 2 番目のテクスチャでは機能しないようです。
何が悪いのかわからない。ここで誰かが私に光を当てることができますか?
ありがとう、マーシャル
クラス COverlayTexture は、テクスチャの作成、リソース ビューの作成、別のアプリケーションからのマップされたビットマップでのテクスチャの塗りつぶし、リソース ビューのピクセル シェーダーへのバインドを担当します。
HRESULT COverlayTexture::Initialize(VOID)
{
D3D10_TEXTURE2D_DESC texDesStaging;
texDesStaging.Width = m_width;
texDesStaging.Height = m_height;
texDesStaging.Usage = D3D10_USAGE_STAGING;
texDesStaging.BindFlags = 0;
texDesStaging.ArraySize = 1;
texDesStaging.MipLevels = 1;
texDesStaging.SampleDesc.Count = 1;
texDesStaging.SampleDesc.Quality = 0;
texDesStaging.MiscFlags = 0;
texDesStaging.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
texDesStaging.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
HR( m_Device->CreateTexture2D( &texDesStaging, NULL, &m_pStagingResource ) );
D3D10_TEXTURE2D_DESC texDesShader;
texDesShader.Width = m_width;
texDesShader.Height = m_height;
texDesShader.BindFlags = D3D10_BIND_SHADER_RESOURCE;
texDesShader.ArraySize = 1;
texDesShader.MipLevels = 1;
texDesShader.SampleDesc.Count = 1;
texDesShader.SampleDesc.Quality = 0;
texDesShader.MiscFlags = 0;
texDesShader.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
texDesShader.Usage = D3D10_USAGE_DEFAULT;
texDesShader.CPUAccessFlags = 0;
HR( m_Device->CreateTexture2D( &texDesShader, NULL, &m_pShaderResource ) );
D3D10_SHADER_RESOURCE_VIEW_DESC viewDesc;
ZeroMemory( &viewDesc, sizeof( viewDesc ) );
viewDesc.Format = texDesShader.Format;
viewDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
viewDesc.Texture2D.MipLevels = texDesShader.MipLevels;
HR( m_Device->CreateShaderResourceView( m_pShaderResource, &viewDesc, &m_pShaderResourceView ) );
}
HRESULT COverlayTexture::Render(VOID)
{
m_Device->PSSetShaderResources(0, 1, m_pShaderResourceView);
D3D10_MAPPED_TEXTURE2D lockedRect;
m_pStagingResource->Map( 0, D3D10_MAP_WRITE, 0, &lockedRect );
// Fill in the texture with the bitmap mapped from shared memory view
m_pStagingResource->Unmap(0);
m_Device->CopyResource(m_pShaderResource, m_pStagingResource);
}
クラス COverlayTexture の 2 つのインスタンスを使用します。それぞれが独自のビットマップをテクスチャに塗りつぶし、シーケンス COverlayTexture[1]、次に COverlayTexture[0] でレンダリングします。
COverlayTexture* pOverlayTexture[2];
for( int i = 1; i < 0; i++)
{
pOverlayTexture[i]->Render()
}
FX ファイルのブレンド状態設定は、次のように定義されています。
BlendState AlphaBlend
{
AlphaToCoverageEnable = FALSE;
BlendEnable[0] = TRUE;
SrcBlend = SRC_ALPHA;
DestBlend = INV_SRC_ALPHA;
BlendOp = ADD;
BlendOpAlpha = ADD;
SrcBlendAlpha = ONE;
DestBlendAlpha = ZERO;
RenderTargetWriteMask[0] = 0x0f;
};
FX ファイルのピクセル シェーダーは次のように定義されています。
Texture2D txDiffuse;
float4 PS(PS_INPUT input) : SV_Target
{
float4 ret = txDiffuse.Sample(samLinear, input.Tex);
return ret;
}
再度、感謝します。
パウロの編集:
どうもありがとう、パウロ。問題は、オブジェクトのどのインスタンスをアルファ テクスチャまたはディフューズ テクスチャにバインドする必要があるかということです。テストとして、COverlayTexture[0] をアルファにバインドし、COverlayTexture[1] を拡散テクスチャにバインドします。
Texture2D txDiffuse[2];
float4 PS(PS_INPUT input) : SV_Target
{
float4 ret = txDiffuse[1].Sample(samLinear, input.Tex);
float alpha = txDiffuse[0].Sample(samLinear, input.Tex).x;
return float4(ret.xyz, alpha);
}
2 つのリソース ビューの PSSetShaderResources を呼び出しました。
g_pShaderResourceViews[0] = overlay[0].m_pShaderResourceView;
g_pShaderResourceViews[1] = overlay[1].m_pShaderResourceView;
m_Device->PSSetShaderResources(0, 2, g_pShaderResourceViews);
結果、何も見えません。チャンネル x、y、z、w も試しました。