glTexParameter和glSamplerParameter有什么区别?

9
因为我不是专家,请不要认为这个问题很傻。我已经阅读了几篇教程,其中使用glTexParameter设置纹理参数。我指的是GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_R等等。
突然间,我看到了一篇教程,现在使用glSamplerParameter来设置这些参数。
我发现glTexParameter和glSamplerParameter之间有一些共同的参数,比如(GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_R、GL_TEXTURE_MIN_LOD等),还有一些只适用于glTexParameter (GL_TEXTURE_BASE_LEVEL、GL_TEXTURE_SWIZZLE_R等)。我完全理解了不常见的那些,因为毕竟glTexParameter作用于图像,而这些参数是指定图像本身的属性。
但是我不太明白为什么这两个GL调用之间会有一些共同的参数。应该在什么时候使用哪一个?在我看来,采样参数如(GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_WRAP_R等)应该只适用于采样器(glSamplerParameter),而不是适用于glTexParameter。
请帮助我理解两者之间的区别。
2个回答

12

glSamplerParameter 是相对较新的技术。一个纹理被采样的方式实际上是采样器的属性,而非纹理本身的属性,这不仅是在语义上,而且在实际的硬件运行中也是如此。

除了希望以实际硬件运行方式来表示事物之外,将两个无关的事物绑定在一起还会在性能方面产生一些成本。如果你将采样的方式作为采样器的属性,那么你可以在同一个着色器中以两种不同的方式对同一个纹理进行采样。如果它是纹理的属性,那么你就必须要上传同一个纹理两次或者编写多通道着色器。

因此,这两个事物现在被分开了。


听起来在许多方面使用glSamplerParameter更好。您能指出使用glTexParameter具有优势的情况吗? - viktorzeid
3
@kvikram说:“真的没有=P Sampler对象是一直以来应该使用的方式,而且在D3D中已经工作了多年。将采样器状态与纹理对象分开是一个巨大的提升,你可以通过绑定不同的采样器到TMU来简单地改变过滤模式。它们是OpenGL 3.3的功能,但得到了广泛支持。” - Andon M. Coleman

4

点击此处查看有关纹理采样器对象的参考信息,并在geeks3d这里获取更多内容。

在OpenGL版本3.3中添加了此功能(因此现在应该已经很好地适应了)。它通常将纹理采样与纹理数据分离。以前这是纹理对象的任务(这相当低效和有问题)。现在新的解决方案提供了很大的灵活性。

参数与纹理对象的参数相同,但仅与采样相关:GL_TEXTURE_WRAP_S​,GL_TEXTURE_WRAP_T​,GL_TEXTURE_WRAP_R​,GL_TEXTURE_MIN_FILTER​,GL_TEXTURE_MAG_FILTER​,GL_TEXTURE_BORDER_COLOR​,GL_TEXTURE_MIN_LOD​,GL_TEXTURE_MAX_LOD​,GL_TEXTURE_LOD_BIAS​,GL_TEXTURE_COMPARE_MODE​或GL_TEXTURE_COMPARE_FUNC​


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接