假设我有渲染目标0到N,RT 0的第四个组件中恰好有一个由材质或蒙版或其他东西指定的Alpha通道。使用第一个渲染目标的Alpha到N?

#1 楼

据我所知,DX或GL中都没有办法将RT 0的alpha重新用于所有混合操作。不幸的是,它似乎并不是硬件所支持的。

您可以为每个渲染目标配置不同的混合模式,或者为某些渲染目标启用混合,而对其他渲染目标禁用;但是,如果为渲染目标启用了混合功能,它将始终使用其自己的Alpha。指定用于与像素着色器(而不是渲染目标的alpha通道)完全独立的输出进行混合的alpha。但是,此模式仅适用于当前硬件上的一个渲染目标。

据我所知,将多个具有相同alpha渲染目标的渲染目标混合在一起的唯一选择是: />
在所有渲染目标上输出相同的Alpha(例如,可以像在延迟着色中那样,将其他值存储到Alpha通道中的功能)。渲染目标,使用双源混合。
使用UAV /图像加载存储在像素着色器中执行混合(仅当几何形状在屏幕空间中不自重叠时才有效,因为没有针对竞争条件的保护措施;也可能有点慢)。
在支持它的硬件上,DX11.3 / DX12 Rasterizer-Order视图,NV_fragment_shader_interlock或INTEL_fragment_shader_ordering(后者也由AMD GPU公开)。这是同一事物的三个名称:基本上是像素着色器中的“关键部分”,使您可以相对于其他像素着色器调用以原子方式读取,修改,写入纹理。它本质上支持任意可编程的混合,但它可能相当慢,并且仅在最新的硬件上可用。


评论


$ \ begingroup $
是的,我认为这也是我的结论。您是否知道DX12或(未发布的)Vulkan是这种情况吗?正如您所提到的,它具有用于延迟渲染的相当大的应用程序,并且目前没有任何替代方法看起来令人满意。
$ \ endgroup $
– Jeremyong
2015年8月9日,下午3:37

$ \ begingroup $
@jeremyong对不起,我认为DX12中的混合操作没有任何变化。不确定Vulkan,但我会感到惊讶。混合硬件没有改变。 FWIW,在我从事的游戏中,我们为延后的贴花制作了第3号项目符号的变体,并对几何图形进行了预处理,以将其分成不重叠的组。
$ \ endgroup $
–内森·里德(Nathan Reed)
2015年8月9日,下午3:58

$ \ begingroup $
Gotcha感谢您的推荐。延迟贴花正是我要执行的
$ \ endgroup $
– Jeremyong
2015年8月9日,下午5:30