Directx11教程十八之Transparency(混合)

这节教程的结构如下:其实和D3D11教程九之多重纹理和纹理数组   那节教程结构差不多


这里就不说了,我呢,写博客比较懒,一般主要写在自己写时主要遇到的问题和怎么解决的,不会像D3D11龙书那样具体列出,望见谅


这里关键的代码就有两段


第一,创建ID3D11BlendState接口

	//初始化混合形容结构体
	ZeroMemory(&blendStateDescription, sizeof(D3D11_BLEND_DESC));
	blendStateDescription.RenderTarget[0].BlendEnable = TRUE;
	blendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
	blendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
	blendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
	blendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
	blendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
	blendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
	blendStateDescription.RenderTarget[0].RenderTargetWriteMask = 0x0f;
	HR(md3dDevice->CreateBlendState(&blendStateDescription, &md3dEnableBlendState));

第二,设置混合状态

void D3DClass::TurnOnBlend()
{
	float BlendFactor[4] = { 0.0f,0.0f,0.0f,1.0f };
	md3dImmediateContext->OMSetBlendState(md3dEnableBlendState, BlendFactor, 1);
}


源像素就是即将打印到背后缓存的像素,目标像素已经在背后缓存的像素,当混合状态打开,“挤”在背后缓存同一位置时的源像素和目标像素会发生混合。

假设源像素为(r1,g1,b1,a1)  目的像素为(r2,g2,b2,a2)

SrcBlend=D3D11_BLEND_SRC_ALPHA   代表源像素颜色混合因子为  a1

DestBlend = D3D11_BLEND_INV_SRC_ALPHA 代表目的像素颜色混合因子为(1-a1)

BlendOp = D3D11_BLEND_OP_ADD  代表像素颜色混合方式为加法

即color=(r1,g1,b1)*a1+(r2,g2,b2)*(1-a1);


SrcBlendAlpha = D3D11_BLEND_ONE 代表源像素Alpha值混合因子为 1.0f

DestBlendAlpha = D3D11_BLEND_ZERO  代表目标像素Alpha像素混合因子为0.0f

BlendOpAlpha = D3D11_BLEND_OP_ADD 代表像素Alpha值混合方式为加法

alpha=a1*1.0f+a2*0.0f=a1  


值得注意的是:在一次像素混合后,混合得到的像素变为目的像素继续迎接下一个”源像素“的到来。


程序运行图:




这节就不必放出源代码了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值