1

我现在想渲染纹理两次,但使用不同的过滤器。使用不同的过滤器将纹理存储两次似乎是一个非常糟糕的主意,这会占用太多的 V-RAM。所以我想出了在旅途中更换过滤器的想法,但它有多快呢?

我正在考虑这样做:

// First render call
BindTexture(...);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
RenderObject( ... );

BindTexture(...);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
RenderObject( ... );

所以最后一个问题是:运行时更新纹理参数的速度有多快?

4

2 回答 2

2

所以我想出了在旅途中更换过滤器的想法,但它有多快呢?

对于 GPU 来说,它只是一个值变化的寄存器。所以它相当便宜。但是你写它的方式没有多大意义。

由于过滤参数是纹理对象的一部分,因此您可以在相关纹理对象之后 glBindTexture设置它们。

如果您只想使用具有不同过滤参数的相同纹理,则不必在其间重新绑定它。

此外,从 OpenGL-3.3 开始,还有一类称为采样器的无数据对象(无数据对象无法共享)。采样器收集纹理采样参数(如过滤),而纹理提供数据。因此,如果您想经常切换过滤参数,或者您对大量纹理有一个常见的采样参数模式,您可以使用服务多个纹理的单个采样器来执行此操作。

http://www.opengl.org/wiki/Sampler_Object

于 2013-06-12T10:05:43.350 回答
2

这在很大程度上取决于您正在使用的 GL 的实现。就像任何与性能相关的事情一样,只需测试一下,看看它是否足够快,可以满足您在目标硬件上的特定应用程序。

相对较新的 GL 版本包括一个名为Samplers的功能,它是您可以使用各种纹理参数创建的对象。您可以创建许多不同的采样器,然后根据需要将它们换掉,而不是重新配置现有的纹理。这还允许您在必要时对同一纹理使用两种不同的纹理采样状态。这通常应该更快,但同样,只需测试并查看在您的特定情况下最有效的方法。

于 2013-06-12T00:05:21.590 回答