这节教程的结构如下:其实和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
值得注意的是:在一次像素混合后,混合得到的像素变为目的像素继续迎接下一个”源像素“的到来。
程序运行图:
这节就不必放出源代码了