gpt4 book ai didi

c++ - OpenGL - 绑定(bind)到默认纹理的做法?

转载 作者:行者123 更新时间:2023-11-28 01:50:04 25 4
gpt4 key购买 nike

我注意到有些人选择将默认纹理绑定(bind)到他们在每个渲染循环中使用的每个纹理单元。这是常见/最佳做法吗?

伪例子:

Tick() {

glUseProgram(someProgram);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, imgTexture1);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, imgTexture2);

.
.
.

//Is the following really necessary: ???

glUseProgram(0);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, 0);

}

如果这里不需要,那么是否应该在释放资源之前进行此类调用?

最佳答案

这对于删除对象不是必需的。当您删除一个对象时,它会自动从每个绑定(bind)点解除绑定(bind)。这仅适用于发出 glDelete* 命令的上下文;共享对该对象的访问的其他上下文不会将其解除绑定(bind)。如果该对象附加到另一个对象(例如附加到帧缓冲区的纹理),那么它也不会取消附加。

自行清理是个不错的主意,主要是为了避免错误。如果着色器试图访问绑定(bind)了某些东西的纹理单元,它可能会“工作”,从而隐藏错误。然而,如果它试图访问一个没有任何绑定(bind)的单元,它很可能会明显失败。

当然,这主要是为了调试,因此您可以#ifdef 围绕此类代码以在发布版本中将其删除。

但是,以上内容假设您在完成渲染后基本上解除绑定(bind)纹理。我提出这个问题是因为您显示的与每个纹理单元解除绑定(bind)的代码不正确。为什么?

因为每个纹理单元都有多个 绑定(bind)点,每个类型 纹理对应一个绑定(bind)点。因此,如果您将纹理绑定(bind)到 GL_TEXTURE_CUBE_MAP,调用 glBindTexture(GL_TEXTURE2D, 0) 不会对绑定(bind)到立方体贴图目标的纹理执行任何操作。

因此,如果您要编写从每个纹理单元解除绑定(bind)纹理的代码,则必须使用 every texture target that exists 调用 glBindTexture :

void UnbindFromTextureUnit(int unit)
{
static const GLenum allTargets[] = {/*Every texture target that exists*/};

glActiveTexture(GL_TEXTURE0 + unit);
for(auto target : allTargets)
glBindTexture(target, 0);
}

或者您可以使用 multibind glBindTextures from GL 4.4 .或者直接状态访问 4.5 glBindTextureUnit()

关于c++ - OpenGL - 绑定(bind)到默认纹理的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43377182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com