在运行时更改纹理参数

时间:2015-06-10 14:16:57

标签: c++ opengl

我是一名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。

我会做什么:我一个接一个地绑定游戏中的所有纹理并再次设置参数。

或者,如果我想影响所有纹理,是否有更先进或更快的方法?

1 个答案:

答案 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);

如果绑定了采样器,则其参数将覆盖当前绑定纹理中的相应值。或者用规范的话说:

  

当采样器对象绑定到纹理单元时,其状态将取代绑定到该纹理单元的纹理对象的状态。如果采样器名称零绑定到纹理单元,则当前绑定纹理的采样器状态将变为活动状态。