从也是渲染目标的纹理中采样

Posted

技术标签:

【中文标题】从也是渲染目标的纹理中采样【英文标题】:Sampling from a texture which is also a render target 【发布时间】:2011-05-03 06:15:23 【问题描述】:

我知道这在技术上是不受支持的(据我所知,这是未定义的行为),但是从同时被写入的纹理中采样真的是一件非常可怕的事情吗?

我问是因为我需要从还需要写入的深度纹理中读取数据,如果我不能这样做,这意味着我将不得不复制深度纹理并且如果它不是那么重要的话我看不出只是复制它的危害吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

Matias 和 Goz 涵盖了最重要的部分。让我补充几个有趣的事实:

当您将其底层资源绑定为渲染目标时,Direct3D 运行时会主动取消绑定纹理(因此您无法在此处创建循环)。 Direct3D 11 中的 UAV 实际上允许对格式子集(不需要类型转换的格式)进行读-修改-写操作。但是,它们不保证任何操作顺序。这是许多实现与订单无关的透明度的算法所使用的,特别是(重新排序是手动完成的)。

【讨论】:

【参考方案2】:

是的,这是致命的,并且会触发未定义的行为。只需制作一个副本并从副本中读取。

解释很简单。由于片段以未指定的顺序并行处理,您可能正在读取已写入的纹素或原始值纹素,并且无法知道您正在阅读什么。复制并从中读取可确保您读取正确的值。

【讨论】:

还值得记住的是,由于缓存和流水线,从纹理中读取会提前发生。这意味着您可能正在尝试从缓存中读取实际纹理中已更改的像素。

以上是关于从也是渲染目标的纹理中采样的主要内容,如果未能解决你的问题,请参考以下文章

多采样渲染到纹理

OpenGL4 多重采样抗锯齿和渲染到纹理

如何在多采样纹理上渲染帧缓冲区对象?

U引擎代码分析

将一个纹理绑定到两个不同的统一采样器

Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样