环境:VS2017  语言:C++

总起:

这一章主要对应红龙书的第九章。

工程地址:https://github.com/anguangzhihen/Dx11。主要以Chapter 9_1 Blend Demo作为讲解的基础。

本次的文章主要讲解三个知识点:Blend混合、Clip剪裁、Fog雾的实现。

首先我们不看Dx11中的Blend,我从Unity的常用的混合公式开始说起。

为什么要混合呢?在不透明的世界中混合是没有必要,但是一旦涉及到透明的物体玻璃、水瓶等,就要考虑到当前物体和背景物体是如何进行混合处理的。

最常用的公式:Blend SrcAlpha OneMinusSrcAlpha。

意思就是当前物体颜色乘以物体Alpha值,而背景的颜色乘以1减去物体Alpha值,再将两者相加就获得了混合后的结果。

还有一种常用的是在特效上使用的颜色叠加效果公式:Blend SrcAlpha One。

我们来看一下本章能完成的效果:

Blend混合:

上述效果图中水和山就是使用Alpha混合。

关键代码:

// 创建混合状态
D3D11_BLEND_DESC transparentDesc = { 0 };
transparentDesc.AlphaToCoverageEnable = false;
transparentDesc.IndependentBlendEnable = 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;
HR(device->CreateBlendState(&transparentDesc, &TransparentBS));// DrawScene中进行混合
float blendFactor[] = { 0.0f, 0.0f, 0.0f, 0.0f };
md3dImmediateContext->OMSetBlendState(RenderStates::TransparentBS, blendFactor, 0xffffffff);
md3dImmediateContext->DrawIndexed(3 * mWaves.TriangleCount(), 0, 0);
md3dImmediateContext->OMSetBlendState(0, blendFactor, 0xffffffff);

我们可以看到类似Unity中的混合公式,没错一模一样。

D3D11_BLEND_DESC:

1.AlphaToCoverageEnable,在开启Multi-sample多重采样时,在透明和不透明之间达到抗锯齿的效果;

2.IndependentBlendEnable,Dx11支持8张RenderTarget的渲染,如果该值为true,则对于每张RenderTarget的渲染单独制定其描述,否则所有RenderTarget都使用第一个描述。

3.RenderTarget,指定描述,即混合公式(唯一要注意的是RenderTargetWriteMask参数可以指定输出颜色)。

ID3D11DeviceContext::OMSetBlendState:

1.pBlendState,设置想要的混合状态;

2.BlendFactor,在混合公式中使用到了D3D11_BLEND_BLEND_FACTOR或D3D11_BLEND_INV_BLEND_FACTOR时作为参考值;

3.SampleMask,强制指定需要的多重采样(如果将第5个bit位改为0,则第5个采样会被禁用,当然此时你必须要有5个以上的采样才行,只有4或以下是没有效果的)。

Clip裁剪:

我们看到效果图中的箱子是中空的,这种效果在片元着色器中使用到了clip技术,判断舍弃Alpha值在0.1以下的像素点。

代码:

// clip透明的部分
bool gAlphaClip = true;
if (gAlphaClip)
{clip(texColor.a - 0.1f);
}

如果clip中的表达式小于0,则会强制舍弃该像素点,并且直接跳过之后代码的执行,所以clip的判断越早执行Shader运行的效率越高。

Fog雾:

这种雾的实现非常简单,是一种类似屏幕的后处理效果,实际场景中是没有具体的雾的。

按照距离,如果物体离相机越远,则该物体混合的雾颜色越多。

具体的计算公式:foggedColor = (1-s)·litColor+s·fogColor。

其中s的计算:s=saturate((dist(p,E)-fogStart)/fogRange)。(saturate相当于clamp(0,1),dist(p,E)代表相机和像素的距离)

让我们来看看具体的代码:

// 雾
bool gFogEnabled = true;
if (gFogEnabled)
{float fogLerp = saturate((distToEye - gFogPos.x) / gFogPos.y);litColor = lerp(litColor, gFogColor, fogLerp);
}

DirectX11编程11 Blend混合相关推荐

  1. 列表怎么有限的初始化为零_《零基础学习Android开发》第五课 类与面向对象编程1-1...

    视频:<零基础学习Android开发>第五课 类与面向对象编程1-1 类的定义.成员变量.构造方法.成员方法 一.从数据与逻辑相互关系审视代码 通过前面的课程,我们不断接触Java语言的知 ...

  2. directx11编程中遇到的错误及解决方法

    directx11编程中遇到的错误及解决方法 参考文章: (1)directx11编程中遇到的错误及解决方法 (2)https://www.cnblogs.com/zhangbaochong/p/55 ...

  3. qt web混合编程_Qt / Web 混合编程

    Qt/Web混合编程 Qt/Web混合应用的出现 今天人们生活.工作在一个互联互通的世界里.人们希望随时随地获得需要的信息.在此背景下,传统应用和WEB应用的界限越来越模糊.Qt/Web混合型应用的出 ...

  4. DirectX11 With Windows SDK--11 混合状态

    文章目录 前言 混合等式 混合等式 混合状态 混合运算符的设置 混合因子的设置 ID3D11Device::CreateBlendState方法--创建混合状态 ID3D11DeviceContext ...

  5. 【Unity Shader】Blend混合

    原文:http://blog.sina.com.cn/s/blog_471132920101d8z5.html Alpha Blending,中文译作Alpha混合 Blending就是控制透明的.处 ...

  6. 一、VS2015update2环境下DirectX11编程说明(2016.5.5更新)

    本文索引: 一 关于龙书 二 在vs2015u2环境下编写DirectX11程序 三 关于MSDN帮助文档 四 官方示例项目 五 自己尝试编写一个小项目 1 创建一个win32项目 2 配置依赖库 3 ...

  7. Introdution to 3D Game Programming With DirectX11 第11章 习题解答

    11.1 这道题要注意使用了line strip,由于曾经一直用triangle list,所以在几何渲染的时候easy算错定点描绘的顺序. 贴一些代码,大概就能把这个问题解释清楚了,由于框架还不是特 ...

  8. msp430入门编程11

    msp430中C语言的模块化头文件及实现11 msp430中C语言的模块化头文件及库文件12 msp430入门学习 msp430入门编程 转载于:https://www.cnblogs.com/guo ...

  9. Shader Blend混合效果

    1.Blend SrcAlpha OneMinusSrcAlpha 正常模式(透明度混合) 2.Blend OneMinusDstColor One 柔和相加(soft Additive) 3.Ble ...

  10. 【原创】Linux环境下的图形系统和AMD R600显卡编程(11)——R600指令集

    1 低级着色语言tgsi OpenGL程序使用GLSL语言对可编程图形处理器进行编程,GLSL语言(以下高级着色语言就是指GLSL)是语法类似C的高级语言,在GLSL规范中,GLSL语言被先翻译成教低 ...

最新文章

  1. python 猜数字大小
  2. mysqldatareader获取整行数据给datarow_SqlDataReader的用法(读取1整行)
  3. 腾讯接入华为鸿蒙!QQ音乐与Harmony OS达成合作 推出听歌识曲万能卡片
  4. 批量处理文件,正则表达式处理文件
  5. 22.Linux/Unix 系统编程手册(上) -- 信号:高级特性
  6. CEEMDAN算法及其应用
  7. DriverFinder(电脑驱动升级软件)官方正式版V4.1.0.0 | 最好的电脑驱动软件之一 | win10更新驱动用什么软件
  8. Mybatis Plus分页Page total始终为0
  9. 掌中革命--手机富媒体
  10. error occurred during initialization of VM报错解决
  11. 在kile中为stm32移植FreeRTOS
  12. 店铺差评有什么影响原因有哪些方面,怎么避免差评,被差评了怎么解决
  13. 电脑计算器所有快捷键
  14. 计【思考】如不解决这些问题,山东招远这类事情以后仍然会不断发生!!
  15. 阿里云 DNS 新增云上线路的智能解析功能
  16. python合并json_组合两个json字典python
  17. 同步linux服务器时间
  18. python3利用xlrd和openpyxl处理表格中以分号结尾固话和手机号的数据提取出手机号
  19. 动态域名搭建exchang邮箱服务器
  20. 线性位置检测 - CHI612替代TLE4997、MLX90251

热门文章

  1. arcgis api for js绘制箭头图
  2. C#:合并EXCEL文件工作表列
  3. Web压缩问题-图片不显示
  4. Python编辑器你选哪个?我选PyCharm
  5. 安装rocky8.5
  6. 量子笔记:量子计算祛魅
  7. RNN的梯度消失和梯度爆炸
  8. 计算机图标被选定无法取消,我电脑桌面上图标全被选中的状态,去不掉怎么处理?...
  9. 太难了 | 2019年互联网寒冬,如何防止自己被裁员失业?
  10. 小米9开发版自带root吗_小米9root权限获取教程