在运行时更改纹理参数

Sor*_*ona 0 c++ opengl

我是OpenGL的初学者,并且为通用课程构建了一个小型引擎。现在,我需要实现的一个约束/功能是在运行时更改纹理质量(插值)。

因此,而不是例如:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Run Code Online (Sandbox Code Playgroud)

它应该更改为mipmaps

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
Run Code Online (Sandbox Code Playgroud)

现在,我有一个Texture类,将其抽象化并加载图像并为纹理等创建ID。

我会做的:我会一一绑定游戏中的所有纹理,然后再次设置参数。

或者,如果我想影响所有纹理,是否有更高级或更快速的方法来实现?

Ret*_*adi 5

在OpenGL 3.2及更高版本中,有纹理采样器对象,可以覆盖纹理本身中的采样参数。您可以在这里使用它们。

如果希望所有纹理都使用相同的采样参数,将特别方便。然后,您可以只创建一个采样器:

GLuint samplerId = 0;
glGenSamplers(1, &samplerId);
glSamplerParameteri(samplerId, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Run Code Online (Sandbox Code Playgroud)

然后,在进行纹理化时,除了常规的纹理绑定之外,您还可以始终绑定此单个采样器对象。如果您真的只有一个,并且想一直使用它,甚至可以一直保持它的绑定:

glBindSampler(GL_TEXTURE_2D, samplerId);
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过一次调用更改采样属性:

glSamplerParameteri(samplerId, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
Run Code Online (Sandbox Code Playgroud)

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

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