第08章透明融合与雾化11.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第08章透明融合与雾化11

第 8 章 透明融合与雾化效果 在D3D中,“混合”发生在像素着色器阶段的下一阶段,即Output Merger Stage。整个场景在全部经历过像素着色器阶段后,对应于屏幕上每一点像素,可能有多个图元(Fragment)。如下图所示: 该图中,场景中有三个点P1,P2,P3投影在屏幕上同一个点P。这样在像素着色器阶段后,针对P1,P2,P3将有三个图元与像素P对应。默认情况下,在渲染管线中,混合是被关闭的。这时为了确定像素P的最终显示颜色,主要依据是深度测试(这时暂不考虑模板测试等其他因素)。通过深度测试的图元将自身颜色替代后缓冲区中P点的当前颜色,未通过的图元被抛弃。 ?????? 当混合功能被打开时,决定最终颜色的方法有所不同。当一个图元通过深度测试后,并不是直接取代后缓冲区中P点的当前颜色,而是通过一定的比例因子与之进行插值(混合),并将结果作为P点的当前值。当然,未通过深度测试的图元依然被抛弃。这个是“混合”的一种最简单例子。除此之外,D3D针对混合阶段有非常多的配置,从而实现各种特殊效果。 1. 混合方程 ?????? 学习混合的第一步,就是要了解混合方程,计算alpha混合颜色的方程如下: 该方程针对每个像素逐一进行。方程左边的C为混合结果,右边Csrc(我们称为源颜色)和Cdst(我们称为目标颜色)分别为即将要绘制的图元颜色值和后缓冲区中该像素当前的颜色;Fsrc和Fdst分别是两个颜色对应的混合因子(通常赋值为表示半透明度的alpha值,也可以是属于枚举D3DBLEND的任意值,用来和Csrc相乘)。注意方程中的在这里为“分量相乘”(Componentwise multiplication),即针对颜色值中的R、G、B三种分量分别进行相乘。源颜色和目标颜色分别与相应的混合因子分量相乘后,将结果进行“op(混合操作)操作(缺少时,为D3DBLENDOP_ADD即相加运算),作为当前图元处理的最终颜色,并替换后缓冲区中该像素处的颜色。 图形显示中,对于alpha混合最普遍的使用方法是:把Fsrc赋值为D3DBLEND_SRCALPHA,即当前绘制像素的alpha值;把Fdst赋值为D3DBLEND_INVSRCALPHA,即1减去当前绘制像素的alpha值。 ?????? 这样一来,计算公式等价与: C=(Csrc×alphasrc)+(Cdst×(1-alphasrc)) 2. 混合操作 针对上述公式中的混合操作”op,在D3D中定义在如下枚举类型中: typedef enum _D3DBLENDOP?{ ????D3DBLENDOP_ADD = 1, ????D3DBLENDOP_SUBTRACT = 2, ????D3DBLENDOP_REVSUBTRACT = 3, ????D3DBLENDOP_MIN = 4, ????D3DBLENDOP_MAX = 5, ????D3DBLENDOP_FORCE_DWORD = 0x7fffffff } D3DBLENDOP; 我们省略各个变量的前缀D3DBLENDOP。 ADD表示相加操作,即; SUBTRACT表示相关(目标-源),即; REV_SUBTRACT表示反射的相关(源-目标),即; MIN表示取源、目标颜色中较小值,即; MAX表示取源、目标颜色中较大值,即。 注意:MIN和MAX操作与混合因子无关。 同样,所有这些操作也适合于计算Alpha值。3. 混合因子 针对方程中的混合因子F,在D3D中有如下几种:typedef enum _D3DBLEND?{ ????D3DBLEND_ZERO = 1, 此外针对颜色混合,F为(0,0,0),针对alpha值,F为0。 ????D3DBLEND_ONE = 2, 针对颜色混合为(1,1,1),针对alpha值为1; ????D3DBLEND_SRCCOLOR = 3, 针对颜色混合为(Rs,Gs, Bs),针对alpha值为As; ????D3DBLEND_INVSRCCOLOR = 4, 针对颜色混合为(1-Rs,1-Gs,1-Bs),针对alpha值为1-As; ????D3DBLEND_SRCALPHA = 5, 针对颜色混合为(As,As,As),针对alpha值为As; ????D3DBLEND_INVSRCALPHA = 6, 针对颜色混合为(1-As,1-As,1-As),针对alpha值为1-As ????D3DBLEND_DESTALPHA = 7, 针对颜色混合为(Ad,Ad,Ad),针对alpha值为Ad; ????D3DBLEND_INVDESTALPHA = 8, 针对颜色混合为(1-Rd,1-Rd,1-Rd),针对alpha值为1-Ad; ????D3DBLEND_DESTCO

文档评论(0)

zhanghc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档