2016-12-05 115 views
0

我想存储和更新纹理中的信息。所以我的想法是,我用当前的信息创建一个新的纹理。在将其存储在渲染过程中时,我实际上想要从相同像素中读取信息并存储两个值的加权平均值。所以呈现给该像素的值以及该像素上已有的值。读取和写入一个纹理(OpenGL)

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

回答

2

我在这里看到两个可能的选项,这取决于混合式

  • Alpha混合:如果所使用的公式可以映射到的glBlendFunc功能之一,那么这是要走的路。如果你想使用线性因子来存储和新值,这应该是可能的。这也是我期望获得最佳性能的选项。

  • 图像加载存储:使用此方法,可以同时读取和写入相同的纹理(see here)。在这里性能通常会非常糟糕,您将不得不使用映像原子操作来确保同一位置的多个片段始终读取正确的值。

复制纹理会,在我看来,只有当你渲染图像,然后在它之后执行一个加权平均计算工作(否则你将不得不每家店操作后纹理复制)。但是如果是这样的话,可以简单地将平均计算的结果渲染成不同的纹理,并且完全避免复制输入数据的所有麻烦。

0

如果使用扩展名是一个选项,您可以使用NV_texture_barrier,它允许从相同纹理进行书写和读取。

+0

或者您可以使用核心[纹理屏障功能已经存在了一年多了](https://www.opengl.org/wiki/Memory_Model#Texture_barrier)。 –