3D图形学编程基础-基于Direct3D11-学习记录(四)混合的使用

来源:互联网 发布:网络语右友是什么意思 编辑:程序博客网 时间:2024/05/01 04:49

Direct3D中的混合

1.什么是混合

为了真实实现物体之间透明度的影响。当混合状态呗开始起时,每一个像素的绘制就可能被多个片段影响,两个相互重叠的物体,前一个比较透明,那么久应该可以看到后面的物体。开启混合后,则启用了alpha值(透明度),每个像素的计算需要通过一定的混合比例进行差值。

2.混合公式的计算

涉及混合操作中,有两个对象,一个是源对象(正在绘制中的图像),一个是目标对象(已经绘制好的对象),在Direct3D中混合操作不能自己编辑,只能调用一些已有的公式。操作符(源颜色*源因子,目标颜色*目标因子)

//混合因子的值种类列举D3D11_BLEND_ZERO//因子为0,说明此颜色完全不使用D3D11_BLEND_ONE//因子为1,当另一个为0是,此值为1,说明完全使用此颜色D3D11_BLEND_SRC_ALPHA//因子为alpha通道值。比较常用的方法D3D11_BLEND_INV_SRC_ALPHA//因子为1-源颜色alpha,使用此方法时,计算公式为((源颜色*源alpha),(目标颜色*(1-源颜色alpha))
//混合操作符D3D11_BLEND_OP_ADD                      //源+目标D3D11_BLEND_OP_SUBTRACT                //源-目标D3D11_BLEND_OP_REV_SUBTRACT      //目标-源D3D11_BLEND_OP_MIN                //源和目标间较小值D3D11_BLEND_OP_MAX                //源和目标之间较大的值

3.混合的使用

第一步:建立一个结构体来描述混合的一些参数

第二步:创建混合状态,可创建多个不同混合方式

第三步:调用混合方式

第一步:D3D11_BLEND_DESC{    bool    AlphaToCoverageEnable;            //是否在多重采样时使用alpha-to-coverage技术,一般设置为false    bool    IndependentBlendEnable;            //并行渲染时是否启用独立渲染     D3D11_RENDER_TARGET_BLEND_DESC    RenderTarget[8];            //能同时设置8个,但当第二个参数为false时,此参数只有第一个有效}    RenderTarget[0].BlendEnable;//是否开启混合模式    RenderTarget[0].SrcBlend;//源因子    RenderTarget[0].DestBlend;//目标因子    RenderTarget[0].BlendOp;//混合操作符    RenderTarget[0].SrcBlendAlpha;//混合公式中源因子的百分比,一般选1    RenderTarget[0].DescBlendAlpha;//混合公式中目标因子百分比,一般选1    RenderTarget[0].BlendOpAlpha;//混合公式中混合百分比的操作。一般和混合操作一样    RnederTarget[0].RenderTargetWriteMask;//掩码,一般设置为D3D11_COLOR_WRITE_ENABLE_ALL

第二步D3D11_BLEND_DESCblendDesc;ZeroMemory(&blendDesc,sizeof(blendDesc));blendDesc.AlphaToCoverageEnable = false;blendDesc.IndependentBlendEnable = false;blendDesc.RenderTarget[0].BlendEnable = false;m_pDevice->CreateBlendState(&blendDesc,&m_pBlendNone);//混合模式1:关闭混合blendDesc.RenderTarget[0].BlendEnable = True;//开启混合blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;//混合因子1blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_SRC_COLOR;//混合因子为源颜色blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;//混合操作符为+blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;blendDesc.RenderTarget[0].DescBlendAlpha = D3D11_BLEND_ONE;blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;blendDesc.RnederTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;m_pDevice->CreateBlendState(&blendDesc,&m_pBlendStateAdd);//混合模式2blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;//混合因子为alphablendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;//混合因子为1-ALPHAblendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;blendDesc.RenderTarget[0].DescBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;m_pDevice->CreateBlendState(&blendDesc,&m_pBlendStateAlpha);//混合模式3
第三步:m_pImmediateContext->OMSetBlendState(m_pBlendStateAlpha, NULL, 0xFFFFFFFF );<span style="white-space:pre"></span>//第一个参数是设置好的混合模式,当不想使用混合时,可设为NULL<span style="white-space:pre"></span>第二个参数为D3D11_BLEND_BLEND_FACTOR时起作用,表示可以重复利用混合状态,其他情况下选择NULL。

文章中内容均来自学习内容的总结







0 0