我是一名OpenGL初学者,我为一门普通课程建造了一个小型引擎。现在我需要实现的一个约束/特性是在运行时更改纹理质量(插值)。
而不是例如:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
应将其更改为mipmaps
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
现在我有一个Texture类来抽象它并加载一个图像并为纹理等创建一个ID。
我会做什么:我一个接一个地绑定游戏中的所有纹理并再次设置参数。
或者,如果我想影响所有纹理,是否有更先进或更快的方法?
答案 0 :(得分:4)
在OpenGL 3.2及更高版本中,有纹理采样器对象,它们可以覆盖纹理本身的采样参数。你可以在这里使用它们。
如果您希望所有纹理都使用相同的采样参数,那将特别方便。然后,您可以创建一个采样器:
GLuint samplerId = 0;
glGenSamplers(1, &samplerId);
glSamplerParameteri(samplerId, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
然后,在纹理化时,除了常规纹理绑定之外,您还可以始终绑定此单个采样器对象。如果你真的只有其中一个,并且想要一直使用它,甚至一直保持它的界限:
glBindSampler(GL_TEXTURE_2D, samplerId);
然后您可以通过一次调用更改采样属性:
glSamplerParameteri(samplerId, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
如果绑定了采样器,则其参数将覆盖当前绑定纹理中的相应值。或者用规范的话说:
当采样器对象绑定到纹理单元时,其状态将取代绑定到该纹理单元的纹理对象的状态。如果采样器名称零绑定到纹理单元,则当前绑定纹理的采样器状态将变为活动状态。