一、基本定义:
- 混合是指两个 Surface(图层)之间以一种特殊算法进行融合。(注:为了理解方便,图层也可以简单的理解为图片)
- 以下的公式中 Src 和 Dst 分别指两个图层,Src 是指源图层 Dst 是指目标图层(注:源图层可以简单的理解为两张纸摞在一起的图片的上面一层,目标层是下面的一层)
- RGB 指的是颜色通道,A 指的是 Alpha 通道。
- D3D 中混合使用的设置为
D3D12_BLEND_DESC
其中的
D3D12_RENDER_TARGET_BLEND_DESC
的若干属性,包括
D3D12_BLEND SrcBlend;
D3D12_BLEND DestBlend;
D3D12_BLEND_OP BlendOp;
D3D12_BLEND SrcBlendAlpha;
D3D12_BLEND DestBlendAlpha;
D3D12_BLEND_OP BlendOpAlpha;
二、PhotoShop 中一些常见混合方法在 D3D BlendState 中的对应的参数设置
-
AlphaBlend (Alpha 混合)
基本公式为:
Color=Src.RGB*Src.A+Dst.RGB*(1.0f-Src.A)
D3D Blend State 的设置为:
SrcBlend=D3D12_BLEND_SRC_ALPHA;
DestBlend=D3D12_BLEND_INV_SRC_ALPHA;
BlendOp=D3D12_BLEND_OP_ADD;
-
Additive (线性减淡/Linear Dodge)
基本公式为:
Color=Src.RGB+Dst.RGB
D3D Blend State 的设置为:
SrcBlend=D3D12_BLEND_ONE;
DestBlend=D3D12_BLEND_ONE;
BlendOp=D3D12_BLEND_OP_ADD;
-
Screen (滤色/Screen)
基本公式为:
Color=1.0f-(1.0f-Src.RGB)*(1.0f-Dst.RGB)
D3D Blend State 的设置为:
SrcBlend=D3D12_BLEND_INV_DEST_COLOR;
DestBlend=D3D12_BLEND_ONE;
BlendOp=D3D12_BLEND_OP_ADD;
-
Multiply (正片叠底/Multiply)
基本公式为:
Color=Src.RGB*Dst.RGB
D3D Blend State 的设置为:
SrcBlend=D3D12_BLEND_DEST_COLOR;
DestBlend=D3D12_BLEND_ZERO;
BlendOp=D3D12_BLEND_OP_ADD;
-
Multipy2X
基本公式为:
Color=Src.RGB*Dst.RGB*2.0f
D3D Blend State 的设置为:
SrcBlend=D3D12_BLEND_DEST_COLOR;
DestBlend=D3D12_BLEND_SRC_COLOR;
BlendOp=D3D12_BLEND_OP_ADD;
-
ColorDodge (颜色减淡/Color Dodge)
基本公式为:
Color=Src.RGB+Src.RGB*Dst.RGB/(1.0f-Dst.RGB)
D3D Blend State 的设置为:
SrcBlend=D3D12_BLEND_INV_DEST_COLOR;
DestBlend=D3D12_BLEND_ZERO;
BlendOp=D3D12_BLEND_OP_ADD;
三、总结
- 上述的混合我只给出了 Color 的混合方法,没有给出 Alpha 的混合方法,因为 Alpha 最终输出的东西是因项目而不同的,需要根据个人需求设定,没有统一的标准,但是 Color 的混合是有统一标准的。
- PhotoShop 中的混合方法除了上述之外还有非常多种类,但是那些混合方法已经不能光靠设置 Blend State 来实现了,需要用 Pixel Shader 来进行混合。使用 Pixel Shader 不仅可以进行更多复杂的混合操作,还可以一次混合多张图。
版权声明:本文为P_hantom原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。