DirectX11如何显示RGBA图像的alpha通道

如有错误,麻烦指出,非常感谢!
前提:
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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值