读写一个纹理(OpenGL)

Read and Write in one Texture (OpenGL)

本文关键字:纹理 OpenGL 一个 读写      更新时间:2023-10-16

我想在纹理中存储和更新信息。因此,我的想法是,我创建了一个新纹理,并提供当前信息。在渲染过程中存储它时,我实际上想从同一像素中读取信息,并存储两个值的加权平均值。因此,呈现给该像素的值以及该像素上已经存在的值。

现在,我经常读到我无法在同一纹理上读写。现在我的问题是,可能有可能吗?如果没有,我应该在渲染步骤之前复制纹理信息并将副本传递给着色器?如果是这样,我该如何复制纹理?还是我应该做一个额外的渲染步骤?

我在这里看到了两个可能的选项,具体取决于混音方程

  • alpha混合:如果可以将所使用的方程式映射到glBlendFunc函数之一,那么这就是要走的方式。如果您想对存储的线性因子使用线性因子,并且应该可以使用新值。这也是我期望表现最好的选择。

  • 图像加载存储:使用此方法,一个人可以同时读写并写入同一纹理(请参阅此处)。性能通常在这里非常糟糕,您将必须使用图像原子操作来确保在同一位置的多个片段始终读取正确的值。

我认为,复制纹理只能在您渲染图像然后之后执行一个加权平均计算时(否则,您必须在每个商店操作后都必须复制纹理)。但是,如果是这种情况,可以简单地将平均计算的结果渲染到不同的纹理,并完全避免复制输入数据的所有麻烦。

如果是一个选项,则可以使用NV_TEXTURE_BARRIER,允许从相同的纹理写和阅读。