OpenGL在运行时改变纹理过滤器的速度有多快?



我在这一点上,我想渲染纹理两次,但使用不同的过滤器。用不同的过滤器存储纹理两次似乎是一个非常糟糕的主意,这将占用太多的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( ... );

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

所以我想到了在旅途中更换滤镜的想法,但这有多快呢?

对于GPU来说,它仅仅是一个值变化的寄存器。所以很便宜。但是你写的方式不太有意义。

由于过滤参数是纹理对象的一部分,因此将它们设置在纹理对象的 glBindTexture之后

如果你想在不同的过滤参数下使用相同的纹理,你不需要在两者之间重新绑定。

也因为OpenGL-3.3有一个类的无数据对象(无数据对象不能被共享)称为采样器。采样器收集纹理采样参数(如滤波),而纹理提供数据。因此,如果你想经常切换过滤参数,或者你对大量纹理有一个通用的采样参数模式,你可以使用一个采样器来处理多个纹理。

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

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

相对较新的GL版本包含了一个叫做Samplers的功能,你可以用不同的纹理参数创建对象。您可以创建许多不同的采样器,然后根据需要交换这些,而不是重新配置现有的纹理。这也允许你在必要的时候为相同的纹理使用两种不同的纹理采样状态。一般来说,应该更快,但是,还是要测试一下,看看在您的特定情况下哪种方法效果最好。

最新更新