[DirectX12学习笔记] 混合

本文介绍了DirectX12中如何实现混合状态以添加透明效果和雾气效果。混合遵循特定的数学公式,并详细列举了各种操作和系数。此外,还展示了如何在像素着色器中使用clip函数进行裁剪,以及创建简单的线性雾气效果。最后,文章提到了透明度Demo的实现步骤,包括对不同渲染层的管理和透明物体的处理策略。
摘要由CSDN通过智能技术生成
  • 注意!本文是在下几年前入门期间所写(young and naive),其中许多表述可能不正确,为防止误导,请各位读者仔细鉴别。

在场景里加入透明效果和雾效


混合状态

混合遵循以下等式

其中 C C C是最终得到的颜色, C s r c C_{src} Csrc是新来到的fragment的颜色, C d s t C_{dst} Cdst是back buffer里已有的像素的颜色, F d s t F_{dst} Fdst F s r c F_{src} Fsrc是两个系数,两个乘是component wise的乘法,中间的运算符号可以由我们规定。

Alpha通道也满足下式
在这里插入图片描述
Alpha和RGB的Operation和Factor都可以分别各自选取。

以下是支持的一些Operation
在这里插入图片描述
此外还有逻辑运算的Operation,但是用逻辑运算就不能用以上的这些运算符号了,在设置blend state的时候要设置一下LogicOpEnable,具体有哪些逻辑算符不再罗列。

然后以下是支持的一些Factor

D3D12_BLEND_ZERO: F = (0, 0, 0) and F = 0
D3D12_BLEND_ONE: F = (1, 1, 1) and F = 1
D3D12_BLEND_SRC_COLOR: F = (rs, gs, bs)
D3D12_BLEND_INV_SRC_COLOR: Fsrc = (1 − rs, 1 − gs, 1 − bs)
D3D12_BLEND_SRC_ALPHA: F = (as, as, as) and F = as
D3D12_BLEND_INV_SRC_ALPHA: F = (1 − as, 1 − as, 1 − as) and F = (1 − as)
D3D12_BLEND_DEST_ALPHA: F = (ad, ad, ad) and F = ad
D3D12_BLEND_INV_DEST_ALPHA: F = (1 − ad, 1 − ad, 1 − ad) and F = (1 − ad)
D3D12_BLEND_DEST_COLOR: F = (rd, gd, bd)
D3D12_BLEND_INV_DEST_COLOR: F = (1 − rd, 1 − gd, 1 − bd)
D3D12_BLEND_SRC_ALPHA_SAT: F = (a′s, a′s, a′s) and F = a′s where a′s = clamp(as, 0, 1)
D3D12_BLEND_BLEND_FACTOR: F = (r, g, b) and F = a, where the color (r, g, b, a) is supplied to the second parameter of the ID3D12GraphicsCommandList::OMSetBlendFactor method. This allows you to specify the blend factor color to use directly; however, it is constant until you change the blend state.
D3D12_BLEND_INV_BLEND_FACTOR: F = (1 − r, 1 − g, 1 − b) and F =1 − a, where the color (r, g, b, a) is supplied by the second parameter of the ID3D12GraphicsCommandList::OMSetBlendFactor method. This allows you to specify the blend factor color to use directly; however, it is constant until you change the blend state.

然后是Blend State,Blend State在创建PSO的时候设置,需要指定以下Desc

typedef struct D3D12_BLEND_DESC {
   
BOOL AlphaToCoverageEnable; // Default: False
BOOL IndependentBlendEnable; // Default: False
D3D11_RENDER_TARGET_BLEND_DESC RenderTarget[8];
} D3D11_BLEND_DESC;

其中AlphaToCoverageEnable是制定一种对植被等渲染的时候有用的一种多重采样技术,默认是关的。
第二个参数IndependentBlendEnable是允许各个RenderTarget使用不同的混合方式(最多八个),如果关闭,则八个RenderTarget都用数组里的0号元素的混合方式。
第三个参数是混合方式数组,最多8个,注意这里虽然名字叫RenderTarget但是类型其实是D3D11_RENDER_TARGET_BLEND_DESC,接下来介绍这个DESC。

typedef struct D3D12_RENDER_TARGET_BLEND_DESC
{
   
BOOL BlendEnable; // Default: False
BOOL LogicOpEnable; // Default: False
D3D12_BLEND SrcBlend; // Default: D3D12_BLEND_ONE
D3D12_BLEND DestBlend; // Default: D3D12_BLEND_ZERO
D3D12_BLEND_OP BlendOp; // Default:
D3D12_BLEND_OP_ADD
D3D12_BLEND SrcBlendAlpha; // Default:
D3D12_BLEND_ONE
D3D12_BLEND DestBlendAlpha; // Default:</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值