D3D中的混合
来源:互联网 发布:海顿的惊愕交响曲知乎 编辑:程序博客网 时间:2024/05/21 03:27
D3D中的混合
D3D中的混合指的是目标像素(后台缓冲)与源像素(光栅化像素)混合(blend)输出的过程。
一、影响最终的混合后输出结果的因素有个:混合因子,混合方法。
1)混合因子(D3D10_BLEND)。
混合因子共有19个。注意:有些混合因子以_COLOR结尾,有的以_ALPHA结尾。其中以_COLOR结尾的混合因子不能用于APPHA混合方程
混合因子分为源混合因子,目标混合因子。区别在于,前者指定的是源像素的比例,后者指定的是目标像素的比例。
2)混合方法(DD10_BLEND_OP)
混合方法有5中,一般常用的就是加、减、乘。
3)混合因子与混合方法的常用组合使用示例
1.屏蔽颜色写入,当我们希望屏蔽后台缓冲只向深度缓冲写入数据时。我们可以这样干,将源像素混合因子设为D3D10_BLEND_ZERO,目标像素混合因子设为D3D10_BLEND_ONE,混合方法设为D3D10_BLEND_OP_ADD
2.像素相加减 。源像素混合因子设为D3D10_BLEND_ONE,目标像素混合因子设为D3D10_BLEND_ONE,混合方法设为D3D10_BLEND_OP_ADD/SUBTRACT
3.像素相乘 。源像素混合因子设为D3D10_BLEND_ZERO,目标像素混合因子设为D3D10_BLEND_SRC_COLOR,混合方法设为D3D10_BLEND_OP_ADD
4.透明效果。 使用源像素的(光栅化像素)的ALPHA分量控制源像素的透明度。将源混合因子设为D3D10_BLEND_SRC_ALPHA,将目标混合因子设为D3D10_BLEND_INV_SRC_ALPHA,混合运算设为D3D10_BLEND_OP_ADD。
注意:当使用该种绘制效果时,要根据透明物体与摄像机之间的距离将物体的绘制顺序进行排序。按照从后向前的顺序进行绘制。(将透明物体后面所有物体先绘制出来,然后才能将透明的源像素和后台缓冲区的目标像素进行混合)
下面是示例:
二、使用混合的流程
定义混合状态(BLEND_STATE)——>启用混合状态——>绘制。
1)定义并创建、使用混合状态
混合状态是一个结构体。内容是:源混合因子,目标混合因子,混合方法,ALPHA源混合因子,ALPHA目标混合因子,ALPHA混合方法。渲染目标写入控制(是多个枚举变量的组合,用来控制何种颜色可以写图后台缓冲,当然也可以只写入ALPHA屏蔽RGB颜色)。
下面是创建并启用一个混合状态的例子(C++代码)
ID3D10BlendState* mTransparentBS;D3D10_BLEND_DESC blendDesc = {0};blendDesc.AlphaToCoverageEnable = false;//不启用AlphaToCoverageblendDesc.BlendEnable[0] = true;//在索引为0的渲染目标中启用混合blendDesc.SrcBlend = D3D10_BLEND_SRC_ALPHA;blendDesc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;blendDesc.BlendOp = D3D10_BLEND_OP_ADD; blendDesc.SrcBlendAlpha = D3D10_BLEND_ONE;blendDesc.DestBlendAlpha = D3D10_BLEND_ZERO;blendDesc.BlendOpAlpha = D3D10_BLEND_OP_ADD;blendDesc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;//全部(RGB颜色和ALPHA都可以写入后台缓冲区)float blendFactor[] = {0.0f, 0.0f, 0.0f, 0.0f};//使用CreateBlendState函数创建blendstatemd3dDevice->CreateBlendState(&blendDesc, &mTransparentBS);//使用OMSetBlendState函数,启用刚刚创建的blendstate
//第二个参数是用于描述RGB颜色向量的浮点数组,不过我不知道它具体是做什么的…
//第三个参数0xffffffff表示不屏蔽任何采样源
md3dDevice->OMSetBlendState(mTransparentBS, blendFactor, 0xffffffff);注意:使用混合会在每个像素上进行工作,当我们不需要使用混合时应当马上将它关闭。以节省开销。关闭方法如下
//空值表示默认混合状态,也就是禁用混合md3dDevice->OMSetBlendState(0);
最后的最后:像其他D3D接口一样,当我们要结束程序时,总要将它释放
mTransparentBS->release();mTransparentBS = 0;
与渲染状态一样,混合状态也可以在效果文件中创建和设置。下面是HLSL代码
BlendState blend{ BlendEnable[0] = TRUE; SrcBlend = SRC_COLOR; DestBlend = INV_SRC_ALPHA; BlendOp = ADD; SrcBlendAlpha = ZERO; DestBlendAlpha = ZERO; BlendOpAlpha = ADD; RenderTargetWiriteMask[0] = 0x0F;};technique Tech{ pass P0 { ... SetBlendState(blend,float4(0.0f,0.0f,0.0f,0.0f),0xffffffff); }}
- D3D中的混合
- 【D3D Review】Blending 混合
- D3D学习笔记:混合
- D3D纹理混合方式
- D3D纹理混合
- D3D混合纹理
- D3D深度测试和Alpha混合
- D3D中的雾
- D3D中的第一人称视角
- D3D中的向量
- D3D中的HLSL
- D3D中的第一人称视角
- D3D中的颜色
- D3D中的粒子系统
- D3D中的坐标系
- D3D中的拾取
- D3D中的光照
- D3D中的设备丢失
- spring mvc异常统一处理(使用ControllerAdvice注解)
- 摘自微信SDK的Base64算法
- Protocol Buffers for Java
- mybatis做like模糊查询
- 14. Longest Common Prefix 简单的题,但是有精简代码的小技巧
- D3D中的混合
- 合理设置apache httpd的最大连接数--linux
- opnet之ethcoax_net模型(一)
- IOS开发第二天
- API19以上透明状态栏导致adjustsize无效软键盘遮挡EditText
- springboot多线程编程
- Ubuntu安装VMware Tools失败
- POJ3176——Cow Bowling(水DP)
- Codeforces#389div.2 2017-01-04 practice (Done)