3D图形学编程基础-基于Direct3D11-学习记录(四)混合的使用
2016-09-02 09:28
330 查看
Direct3D中的混合
1.什么是混合
为了真实实现物体之间透明度的影响。当混合状态呗开始起时,每一个像素的绘制就可能被多个片段影响,两个相互重叠的物体,前一个比较透明,那么久应该可以看到后面的物体。开启混合后,则启用了alpha值(透明度),每个像素的计算需要通过一定的混合比例进行差值。
2.混合公式的计算
涉及混合操作中,有两个对象,一个是源对象(正在绘制中的图像),一个是目标对象(已经绘制好的对象),在Direct3D中混合操作不能自己编辑,只能调用一些已有的公式。操作符(源颜色*源因子,目标颜色*目标因子)
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
文章中内容均来自学习内容的总结
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。
文章中内容均来自学习内容的总结
相关文章推荐
- 3D图形学编程基础-基于Direct3D11-学习记录(三)纹理的使用
- 3D图形学编程基础-基于Direct3D11-学习记录(二)光照模型的实现
- 3D图形学编程基础-基于Direct3D11-学习记录(一)初始化DX设备,实现立方体绘制
- 学习使用J2EE Web应用的事件功能-Java基础-Java-编程开发
- 基于Corba技术使用java与C++混合编程
- 动态链接库的创建和使用(基础版)——学习记录
- Windows下DOS命令行使用和编程(学习记录)
- Java基础知识强化之网络编程笔记18:Android网络通信之 使用HttpClient的Post / Get 方式读取网络数据(基于HTTP通信技术)
- android学习记录1(ADT,SDK,ADB,点击事件等基础使用)
- 【从零开始】Java基础学习记录(二) == 和 equals 方法的区别和使用
- MOSS Search学习记录(十):MOSS Visual How To使用SharePoint Server 2007搜索对象模型编程创建搜索查询
- Java基础知识强化之网络编程笔记16:Android网络通信之 使用Http的Get方式读取网络数据(基于HTTP通信技术)
- ftrace基础知识学习+使用实例 (仅作学习记录)
- Android学习记录之BaseAdapter及其SubClass基础使用1
- Windows窗体编程基础学习:使用 NotifyIcon 组件向任务栏添加应用程序图标
- MFC Windows编程基础( 学习记录2015.3)
- Android基于客户端和服务器的Socket编程例子之Socket基础通讯--socket模型使用
- PyQt5学习记录(5)---QDockWidget和QListWidget的基础综合使用
- python核心编程学习记录之基础知识
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件