Blending(融合)
Src Pixesl: 源像素 : 指的是当前光栅化产生的值
Dst Pixels 目标像素.指的是先前渲染存储在RT中的值
可以用来实现那些效果,诸如水,玻璃 以及其他的,(后面在说)
在光栅化ij 像素的时候,如果没有开启混合,那么新值将覆盖旧值(深度测试通过),如果开始混合,那么将通过D3D11_BLEND_DESC 的设置来融合新值和旧值,然后将融合后的值写入,让我们来看下这个DESC
typedef struct D3D11_BLEND_DESC {
BOOL AlphaToCoverageEnable;
BOOL IndependentBlendEnable;
D3D11_RENDER_TARGET_BLEND_DESC RenderTarget[8];
} D3D11_BLEND_DESC;
抛去前两个项不讲,因为我们可以同时绑定多个RT,所以RT的DESC是个数组,用来纷纷对应,
IndependentBlendEnable项根据名字便可以得知,当其设置为true时,不同的RT使用对应的RT_DESC,而设置为false,便只会使用RenderTarget[0], D3D11_RENDER_TARGET_BLEND_DESC 会详细指定如何融合
typedef struct D3D11_RENDER_TARGET_BLEND_DESC {
BOOL BlendEnable;
D3D11_BLEND SrcBlend;
D3D11_BLEND DestBlend;
D3D11_BLEND_OP BlendOp;
D3D11_BLEND SrcBlendAlpha;
D3D11_BLEND DestBlendAlpha;
D3D11_BLEND_OP BlendOpAlpha;
UINT8 RenderTargetWriteMask;
} D3D11_RENDER_TARGET_BLEND_DESC;
第二个项和第三个项用来设置源像素和目标像素的系数(权重),第四个项用来指定两个分别计算出来的值将如何计算的(一般的是D3D11_BLEND_OP_ADD
),最终颜色便是这样计算的
OutputPixel = ( SourceColor.rgba * SrcBlend ) __BlendOp__ ( DestColor.rgba * DestBlend )
你可以看见alpha是另外计算的,计算方式同上
那么D3D11_BLEND到底有那些系数了:
D3D11_BLEND_ZERO /D3D11_BLEND_ONE 故名思意
D3D11_BLEND_SRC_COLOR = (Rs, Gs, Bs, As) (注意,括号里是颜色值)
既然有SRV_COLOR,那么也有对应 的INV_SRC,系数为1 – 对应的项,即: (1 - Rs, 1 - Gs, 1 - Bs, 1 - As),也有对应的DST_COLOR,INV_DST_COLOR
那么还有SRC_ALPHA,INV_SRC_ALPHA,还有对应的DST_ALPHA
还有一些比较特殊的就不写了
(一般的,我们很少需要DST的ALPHA,因为一般的算法只需要有SRC的ALPHA即可完成)
有那些操作:
相加,相减(dst-src),反向相减(src-dst),{最小和最大(这个时候忽略系数,直接对颜色操作)
(你可以为颜色和alpha指定不同的操作,否则两个op毫无存在意义)
至于创建,所有的创建接口都在ID3D11Device哦,函数实在没什么好介绍的
至于AlphaToCoverageEnable 暂时设置为false
RenderTargetWriteMask 你可以用来控制颜色的写入,几个枚举量是enable_red,green,blue,alpha,你可以对他们使用 | 运算符
至于绑定一个BlendState,调用DeviceContext的接口即可(这函数可以接受系数,用来特定的系数计算,具体见D3D11_BLEND_BLEND_FACTOR 或者 D3D11_BLEND_INV_BLEND_FACTOR)
下面的代码创建,以及完成绑定
D3D11_BLEND_DESC
transparentDesc
=
{
0
};
//transparentDesc.AlphaToCoverageEnable = false; 默认为false
//transparentDesc.IndependentBlendEnable = false; 默认为false
transparentDesc.RenderTarget[0].BlendEnable
=
true;
transparentDesc.RenderTarget[0].SrcBlend
=
D3D11_BLEND_SRC_ALPHA;
transparentDesc.RenderTarget[0].DestBlend
=
D3D11_BLEND_INV_SRC_ALPHA;
transparentDesc.RenderTarget[0].BlendOp
=
D3D11_BLEND_OP_ADD;
transparentDesc.RenderTarget[0].SrcBlendAlpha
=
D3D11_BLEND_ONE;
transparentDesc.RenderTarget[0].DestBlendAlpha
=
D3D11_BLEND_ZERO;
transparentDesc.RenderTarget[0].BlendOpAlpha
=
D3D11_BLEND_OP_ADD;
transparentDesc.RenderTarget[0].RenderTargetWriteMask
=
D3D11_COLOR_WRITE_ENABLE_ALL;
ID3D11BlendState*
TransparentBS;
ID3D11Device->CreateBlendState(&transparentDesc,
&TransparentBS));
float
blendFactors[]
=
{
0.0f,
0.0f,
0.0f,
0.0f
};
ID3D11DeviceContext->OMSetBlendState(TransparentBS, blendFactor,
0xffffffff);
实际应用时,我们需要统一管理这些状态,这是很必要的,而且要避免状态的切换(这个也许说的不对)
题外话:
渲染状态大概有以下:
世界,观察,投影矩阵,光源,纹理绑定,纹理寻址和过滤方式,深度测试,融合(blend),
有意思的是,路过在提交图元之间,我们忘记设置某方面的状态,上一图元的设置便会泄露到下一图元.这是个重要的暗示,因为切换状态总是需要代价的
下一篇文章将实现一些具体效果
Blending(融合)的更多相关文章
- Three.js开发指南---粒子和粒子系统(第七章)
使用粒子可以很容易的创建很多细小的物体,例如雨滴雪花等 本章主要内容: 1 使用ParticleBasicMaterial(基础粒子材质)来创建和设计粒子 2 使用ParticleSystem来创建一 ...
- Unity3D学习笔记(十六):Animator新动画
新动画系统: 给模型选择动画类型 普通动画:Generic 人形动画:Humanoid 建立动画控制器 - 在Project右击 - 选择Create-AnimatorContorller 将对应动画 ...
- 模型融合之blending和stacking
1. blending 需要得到各个模型结果集的权重,然后再线性组合. """Kaggle competition: Predicting a Biological Re ...
- 图像融合之拉普拉斯融合(laplacian blending)
一.拉普拉斯融合基本步骤 1. 两幅图像L,R,以及二值掩模mask,给定金字塔层数level. 2. 分别根据L,R构建其对应的拉普拉斯残差金字塔(层数为level),并保留高斯金字塔下采样最顶端的 ...
- DirectX基础学习系列5 融合技术
7.1融合方程 1概念 融合技术将当前光栅化像素的颜色与以前已光栅化并处于同一个位置的像素颜色进行合成,即将当前要进行光栅化的三角形单元与已写入后台的像素进行融合 2需要遵循的原则: (1)先绘制不需 ...
- Poisson Blending(Seamless clone)研究和实现
Poisson Blending 实现了非常棒的效果,可以看 <自己动手,实现“你的名字”滤镜> http://www.cnblogs.com/jsxyhelu/p/7216795.htm ...
- 使用liner、feather、multiband对已经拼接的数据进行融合
所谓"blend",英文解释为“vt. 混合vi. 混合:协调n. 混合:掺合物”这里应该理解为是图像数据的融合.这是“识别->对准->融合”的最后一步.融合是决定拼接 ...
- 机器学习技法之Aggregation方法总结:Blending、Learning(Bagging、AdaBoost、Decision Tree)及其aggregation of aggregation
本文主要基于台大林轩田老师的机器学习技法课程中关于使用融合(aggregation)方法获得更好性能的g的一个总结.包含从静态的融合方法blending(已经有了一堆的g,通过uniform:voti ...
- Unity---动画系统学习(6)---Avatar Mask动画融合、Layers动画分层、IK反向动力学
1. 介绍 Avatar Mask(动画融合) 前面我们一直介绍的都是动画混合,一般用于解决边跑边转弯的问题.而动画融合一般用于解决例如边跑边挥手的问题. 简单说就是让跑步去控制腿的骨骼,挥手控制手的 ...
随机推荐
- 关于文章“cocos2dx移植android平台-我的血泪史”需要注意事项
关于文章"cocos2dx移植android平台-我的血泪史"需要注意事项 在上次转载的这篇文章中,按照配置一步一步的下去.发现工程中在Android.mk中有一处错误.直接bui ...
- HDU 2040 亲和数 [补] 分类: ACM 2015-06-25 23:10 10人阅读 评论(0) 收藏
今天和昨天都没有做题,昨天是因为复习太累后面忘了,今天也是上午考毛概,下午又忙着复习计算机图形学,晚上也是忘了结果打了暗黑3,把暗黑3 打通关了,以后都不会玩太多游戏了,争取明天做3题把题目补上,拖越 ...
- poj 3264 Balanced Lineup(RMQ裸题)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 43168 Accepted: 20276 ...
- c++中__declspec用法总结
“__declspec”是Microsoft c++中专用的关键字,它配合着一些属性可以对标准C++进行扩充.这些属性有:align.allocate.deprecated. dllexport.dl ...
- 专门查看阻塞和死锁情况以及引起的SQL语句,你可以创建后,直接运行之。
CREATE procedure sp_who_lock as begin declare @spid int declare @blk int declare @count int declare ...
- 优化checkbox和radio,类似Bootstrap中的iCheck
checkbox和radio浏览器默认的已经满足不了大众的审美需求,更不用说浏览器之间的差异化,取而代之,优化checkbox和radio的方法也随之诞生了. html结构:单选框为例,简单说明: 其 ...
- ASP.NET基础之HttpModule 、HttpContext、 HttpHandler
http://www.cnblogs.com/wujy/p/3261141.html http://www.cnblogs.com/wujy/p/3264475.html http://www.cnb ...
- shared_ptr注意事项
对shared_ptr的Copy构造和Copy赋值,会改变引用计数,但是对shared_ptr中原始资源的Copy构造和Copy赋值,不会改变引用计数.因此存在下面的危险情况: 1.获取资源时,初始化 ...
- 从客户端(&)中检测到有潜在危险的 Request.Path 值解决方案
出这个问题基本上是在转址字符串中有非法字符“<”,'&'之类的. 方案1: 如果仅仅只是转换页面,传参时出现的问题,可对数据加密: 绑定数据传值时加密 <%#Server.UrlE ...
- HttpResponse类
HttpReponse是服务器接收到浏览器的请求后,处理返回结果常用的一个类. 一.属性 Buffer 获取或设置一个值,该值指示是否缓冲输出并在处理完整个响应之后发送它. BufferOutput ...