我正是在这一点上我想要渲染纹理两次但是使用不同的滤镜。 使用不同的过滤器将纹理存储两次似乎是一个非常糟糕的主意,这会占用过多的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( ... );
所以最后一个问题是:在运行时更新纹理参数的速度有多快?
答案 0 :(得分:2)
这在很大程度上取决于您正在使用的GL的实施。与性能相关的任何内容一样,只需测试并查看它是否足够快,以便在目标硬件上使用特定应用程序。
相对较新版本的GL包含一个名为Samplers的功能,它是您可以使用各种纹理参数创建的对象。您可以创建许多不同的采样器,然后根据需要将它们交换出来,而不是重新配置现有纹理。如果需要,这还允许您为相同的纹理使用两种不同的纹理采样状态。这个应该一般来说更快,但同样,只需测试一下,看看哪种情况在您的特定情况下效果最佳。
答案 1 :(得分:2)
所以我想出了一个改变过滤器的想法,但速度有多快?
对GPU来说,它只是一个值变化的寄存器。所以它很便宜。但是你写它的方式没有多大意义。
由于过滤参数是纹理对象的一部分,因此在相关纹理对象的 glBindTexture
之后设置它们。
如果您只想使用具有不同过滤参数的相同纹理,则不必在其间重新绑定它。
此外,自OpenGL-3.3以来,还有一类称为采样器的无数据对象(无数据对象无法共享)。采样器收集纹理采样参数(如滤波),而纹理提供数据。因此,如果您想经常切换过滤参数,或者对于大量纹理有一个共同的采样参数模式,您可以使用服务多个纹理的单个采样器来完成此操作。