您的位置:首页 > 编程语言

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

2016-09-02 09:28 267 查看
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_DESC	blendDesc;
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;		//混合因子1
blendDesc.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);	//混合模式2
blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;		//混合因子为alpha
blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;	//混合因子为1-ALPHA
blendDesc.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。


文章中内容均来自学习内容的总结
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐