C++ 在运行时更改纹理参数

C++ 在运行时更改纹理参数,c++,opengl,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) 现在,我有了一个纹理类,它对纹理进行

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

因此,例如:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
应将其更改为mipmaps

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)
现在,我有了一个纹理类,它对纹理进行抽象,加载一个图像,并为纹理创建一个ID等

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


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

在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);
如果已绑定采样器,其参数将覆盖当前绑定纹理中的相应值。或者用规范的话来说:

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


在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);
如果已绑定采样器,其参数将覆盖当前绑定纹理中的相应值。或者用规范的话来说:

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


在openGL 4.4之前,我认为您的方法是正确的。如果这是维也纳大学的labcourse,那么这正是我们希望您做的:)。@BDL Reto Koradi的答案不是更好的解决方案吗?:)是的,这是肯定的,如果你有时间,你可以实施它。我只是想说,你的第一个解决方案也很好。在openGL 4.4之前,我认为你的方法是正确的。如果这是维也纳大学的labcourse,那么这正是我们希望你做的:)。@BDL Reto Koradi的答案不是更好的解决方案吗?:)是的,这是肯定的,如果你有时间,你可以实施它。我只是想说,你的第一个解决方案也很好。