渲染到纹理,但如何使用DirectX将其保存为透明?
我正在使用DirectX 11 SDK,并将一些东西渲染到纹理中(而且效果很好)。然后使用D3DX11SaveTextureToFile将输出保存到PNG纹理。一切正常,但我没有透明度 我希望背景(没有渲染任何元素的空间)透明。相反,我得到了一些背景知识 我试图将渲染到纹理,但如何使用DirectX将其保存为透明?,directx,png,transparency,render-to-texture,Directx,Png,Transparency,Render To Texture,我正在使用DirectX 11 SDK,并将一些东西渲染到纹理中(而且效果很好)。然后使用D3DX11SaveTextureToFile将输出保存到PNG纹理。一切正常,但我没有透明度 我希望背景(没有渲染任何元素的空间)透明。相反,我得到了一些背景知识 我试图将ClearRenderTargetView函数的float ClearColor[4]更改为{0.0f,0.0f,0.0f,1.0f},因为我认为最后一个是alpha和1.0f,具有透明性,但这对我不起作用(对于0.0f) 以下是我的代
ClearRenderTargetView
函数的float ClearColor[4]
更改为{0.0f,0.0f,0.0f,1.0f}
,因为我认为最后一个是alpha和1.0f,具有透明性,但这对我不起作用(对于0.0f)
以下是我的代码中可能有用的部分:
混合状态(我认为这很好,它们用于在屏幕上渲染透明元素-当然,监视器的屏幕总是有一些“背景”,PNG文件不是):
以及:
如果要保存PNG文件,请使用
D3DX11\u IFF\u PNG
而不是D3DX11\u IFF\u BMP
正如PolGraphic在其评论中提到的,可能需要将混合状态从D3D11_blend_SRC_ALPHA和D3D11_blend_INV_SRC_ALPHA更改为适用于PNG的D3D11_blend_ALPHA。但是,在大多数情况下,默认设置SRC_ALPHA/INV_SRC_ALPHA应该可以工作。ALPHA反过来工作。0.0f表示完全透明,1.0f表示完全可见。(alpha值=不透明度)我已经尝试过了,但是我根本没有得到我的图像。图像的一半和透明背景上只有一个黑色矩形。更奇怪的是,矩形出现在应该有透明背景(没有元素)的地方,而透明的出现在有对象的地方。你确定你有正确的混合状态吗?并确保清除到(0,0,0,0)。感谢关于混合状态。从D3D11_BLEND_SRC_ALPHA和D3D11_BLEND_INV_SRC_ALPHA更改为D3D11_BLEND_ALPHA适用于PNG!但在场景中,我得到了半透明的所有对象。不知道为什么,但我必须使用不同的混合状态来渲染PNG和场景。你能编辑你的anserw并在那里放置关于混合状态的信息吗?读者会更清楚,因为最后的安瑟尔部分在评论中;-)
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());