1

私はDirectX11SDKを使用していて、テクスチャに何かをレンダリングしています(そしてそれは機能します)。D3DX11SaveTextureToFileを使用して、出力をPNGテクスチャに保存するよりも。すべてが機能しますが、透明性が得られません。

背景(要素がレンダリングされていないスペース)を透明にしたい。これの代わりに、私はいくつかの背景を取得します。

float ClearColor[4]関数のforをに変更しようとしたのは、最後のClearRenderTargetView関数がアルファで1.0fであり、透明性が得られると思ったためですが、それはうまくいきませんでした(0.0fでも同じです)。{ 0.0f, 0.0f, 0.0f, 1.0f }

これが私のコードの役に立つかもしれない部分です:

ブレンド状態(これは良いと思います。画面上に透明な要素をレンダリングするために機能します。もちろん、モニターの画面には常に「背景」がありますが、PNGファイルにはありません):

D3D11_BLEND_DESC blendDesc;
ZeroMemory(&blendDesc, sizeof(D3D11_BLEND_DESC) );
blendDesc.AlphaToCoverageEnable = false;
blendDesc.IndependentBlendEnable = false;        
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;
blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL ;

ID3D11BlendState * blendState;

if(FAILED(device->CreateBlendState(&blendDesc, &blendState))){
        //...
}

g_pImmediateContext->OMSetBlendState(blendState,NULL,0xffffffff);

と:

// Setup the render target texture description.
textureDesc.Width = textureWidth;
textureDesc.Height = textureHeight;
textureDesc.MipLevels = 1;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
textureDesc.SampleDesc.Quality = 0;
textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;    
...
//Create the render target texture.
result = device->CreateTexture2D(&textureDesc, NULL, &renderTargetTexture);  
...
result = device->CreateShaderResourceView(renderTargetTexture, 
    &shaderResourceViewDesc, &shaderResourceView);  
...
g_pImmediateContext->OMSetRenderTargets(1, &renderTargetView, 
    g_pDepthStencilView);
float ClearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; //red, green, blue, alpha
g_pImmediateContext->ClearRenderTargetView( renderTargetView, ClearColor );

//clear the depth buffer to 1.0 (max depth)
g_pImmediateContext->ClearDepthStencilView( g_pDepthStencilView, 
    D3D11_CLEAR_DEPTH, 1.0f, 0 ); 
...
//render here
...
D3DX11SaveTextureToFile(g_pImmediateContext, renderTargetTexture, 
    D3DX11_IFF_BMP, CommonFunctions::s2ws(newTextureName).c_str());
4

1 に答える 1

3

PNGファイルを保存する場合は、D3DX11_IFF_PNGの代わりにを使用しますD3DX11_IFF_BMP


PolGraphicがコメントで述べたように、ブレンド状態をD3D11_BLEND_SRC_ALPHAおよびD3D11_BLEND_INV_SRC_ALPHAからPNGで機能するD3D11_BLEND_ONEに変更する必要がある場合があります。ただし、ほとんどの場合、デフォルト設定のSRC_ALPHA/INV_SRC_ALPHAが機能するはずです。

于 2012-12-24T13:38:27.387 に答える