[toc]

# 什么是混合 (blending)

混合是使我们已经计算好的像素 (片元) 与当前正在计算的像素 (片元) 进行颜色的混合和融合 (即半透明之类的效果)

以及另一种混合方法,即 "离屏" 混合,有时候可以直接将像素渲染到一个 "离屏" 的渲染目标中,然后与当前帧进行混合

# 混合方程

设 C_src 为当前正在光栅化的第 i 行、第 j 列像素 (源像素) 的颜色值,再设 C_dst 为目前在后台缓冲区中与之对应的第 i 行、第 j 列像素 (目标像素) 的颜色值 在混合之前,C_scr 会先进行深度 / 模板测试,通过这些测试之后,如果不进行混合,则源像素会直接覆盖缓冲区中的像素 若使用了混合技术,则 C_src 会和 C_dst 进行融合成新颜色 C 再覆写 C_dst Directx12 中使用下列方程来进行颜色的混合 在实际运算中,颜色中的 RGB 和 alpha 会分开进行混合运算,这是为了获得更多的混合变化效果 下面有几种混合方法 上面 RGB 混合方法同样可以运用在 alpha 中,同时 RGB 和 alpha 可以使用不同的混合方法 Directx12 最新几版引入了更多的混合方法,如使用逻辑混合 (但注意,传统混合不能与新版混合一起使用,只能择其一)

# 混合因子

上面公式中的 F 就是混合因子
内置的混合因子有如下几个 对于 alpha 混合而言,不可以使用_COLOR 结尾的混合因子

# 混合状态

不设置混合状态,则使用的是默认的混合状态,但实际上可以通过 D3D12_GRAPHICS_PIPELINE_STATE_DESC 中的 BlendSatte 来设置自定义的混合技术

# 加法混合与减法混合

可以发现,实际上上述的加法与减法可以实现类似于抓痕一类的效果

# 乘法混合

上述公式是乘法混合,即先进行 F 混合,然后将源颜色与目标颜色进行混合

# 禁用深度测试

通常使用透明度混合时,我们不希望像素在混合前就因为深度测试被裁剪掉,所以会禁用深度测试

更新于

请我喝[茶]~( ̄▽ ̄)~*

Solvarg 微信支付

微信支付

Solvarg 支付宝

支付宝

Solvarg 贝宝

贝宝