如有错误,麻烦指出,非常感谢!
前提:
DX11默认不显示alpha通道的,要想显示alpha通道需要设置一个混合状态。
代码背景
我已经绘制好一幅RGBA图像到nowTexSRV中,现在要做的是把它原样绘制到后备缓冲区中,并用Present(0,0)将其在前台显示出来。
具体代码实现:
1.参数设置
// ***********初始化混合状态***********
/*对于两个相同位置的像素点,规定Csrc为源像素的颜色(从像素着色器输出的像素),
Cdst为目标像素的颜色(已经存在于后备缓冲区上的像素)。*/
//D3D11_BLEND_DESC blendDesc;
ZeroMemory(&blendDesc, sizeof(blendDesc));
auto& rtDesc = blendDesc.RenderTarget[0];
// 透明混合模式
// Color = SrcAlpha * SrcColor + (1 - SrcAlpha) * DestColor
// Alpha = SrcAlpha
blendDesc.AlphaToCoverageEnable = false;
blendDesc.IndependentBlendEnable = false;
rtDesc.BlendEnable = true;
rtDesc.SrcBlend = D3D11_BLEND_SRC_ALPHA;
rtDesc.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
rtDesc.BlendOp = D3D11_BLEND_OP_ADD;
rtDesc.SrcBlendAlpha = D3D11_BLEND_ONE;
rtDesc.DestBlendAlpha = D3D11_BLEND_ZERO;
rtDesc.BlendOpAlpha = D3D11_BLEND_OP_ADD;
rtDesc.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;/*别忘了加上这个参数,否则为纯白色*/
hr = m_d3dDevice->CreateBlendState(&blendDesc, BSAlphaToCoverage.GetAddressOf());
2.图像绘制
上述处理结果是指处理得到的带有alpha通道的图像,存到nowTexSRV中。
/*将上述处理结果原样输出到后备缓冲区*/
m_d3dDevContext->VSSetShader(m_vertexShader.Get(), nullptr, 0);/*使用这个顶点着色器*/
m_d3dDevContext->PSSetShader(m_pixelShader_output.Get(), nullptr, 0);/*使用这个片段着色器*/
/*重新设置渲染目标绑定的纹理为后备缓冲区纹理*/
hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backBuffer.ReleaseAndGetAddressOf());
hr = m_d3dDevice->CreateRenderTargetView(backBuffer.Get(), nullptr, m_renderTargetView.ReleaseAndGetAddressOf());
//将渲染目标视图和深度/模板缓冲区结合到管线
m_d3dDevContext->OMSetRenderTargets(1, m_renderTargetView.GetAddressOf(), m_depthStencilView.Get());
/*设置渲染状态--开启混合模式*/
m_d3dDevContext->OMSetBlendState(BSAlphaToCoverage.Get(), nullptr, 0xFFFFFFFF);
/*设置第3个像素着色器资源--让该着色器资源视图绑定到渲染管线的指定阶段*/
/*注意:设置中间纹理为着色器资源必须在重新绑定RTV之后,因为中间纹理只能作为输出或者输入*/
m_d3dDevContext->PSSetShaderResources(1, 1, nowTexSRV.GetAddressOf());/*这样在HLSL里对应regisgter(t1)的gTex_now存放的就是中间纹理*/
/*绘制四边形到后备缓冲区*/
m_d3dDevContext->Draw(4, 0);/*RGBA格式*/
//每帧更新完都需要交换下前后台的缓冲区,把后台画好的东西显示到屏幕上
m_swapChain->Present(0,0);
参考资料:
混合状态相关知识以及参数设置:https://www.cnblogs.com/X-Jun/p/9346640.html