c++ - 在openGL中多次绑定缓冲区
问题描述
在学习 opengl时,有点困惑是是否需要多次绑定 VAO 或纹理 ID 等缓冲区而不解除绑定?
参考上面的链接和完整的源代码,我遇到了两个有点不同的场景。
首先,作者创建了一个 VAO(在 maindraw 循环之外)并使用 绑定 VAO, glBindVertexArray(VAO)
然后他没有使用 取消绑定它glBindVertexArray(0);
,但他在 maindraw 循环中再次绑定它。我的困惑,这真的有必要吗?当前绑定的 VAO 不是已经……绑定了吗?当它已经是活动的 VAO 时,为什么还要绑定它?
和,
其次,作者使用以下方法创建纹理 ID:
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
//some more code
glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);
在主绘制循环之外,但在主绘制循环内再次执行此操作:*
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
我不明白他所做的两件事是:
- 当他在主循环之外完成后,为什么他在主循环中再次绑定纹理ID?(这个类似于VAO,但我不知道是否可以在这里取消绑定)
- 为什么他选择
glActiveTexture
循环内的活动纹理单元(使用)?不能在主绘制循环之外完成吗?
解决方案
glBindTexture
将纹理绑定到指定目标和当前纹理单元。当前纹理单元由 设置glActiveTexture
。当前纹理单元是全局状态,并glBindTexture
考虑该状态。
那意味着当你这样做的时候
glBindTexture(GL_TEXTURE_2D, texture1);
glBindTexture(GL_TEXTURE_2D, texture2);
glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE1);
之后texture2
绑定到当前纹理单元(GL_TEXTURE0
默认情况下),当前纹理单元为GL_TEXTURE1
. 注意texture1
只是被绑定了一小会儿,但是绑定丢失了,什么时候texture2
绑定了。
相比之下,当你这样做时
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
当前纹理单元显式设置为GL_TEXTURE0
并texture1
绑定到纹理纹理单元 0。之后,当前纹理单元切换到GL_TEXTURE1
并 texture2
绑定到纹理单元 1(因为此时它是当前的)。
请注意,使用直接状态访问和glBindTextureUnit
(从 OpenGL 4.5 开始)可以将纹理直接绑定到纹理单元。例如:
glBindTextureUnit(GL_TEXTURE0, texture1);
glBindTextureUnit(GL_TEXTURE1, texture2);
推荐阅读
- android - 在根项目“android”中找不到任务“SigningRequest”
- python - 使用 python 和 playwright 库将文件上传到大小超过 1 GB 的测试网站
- php - PHP ob_get_contents 为空
- c++ - 没有引用的对象的内存会自动清除吗?
- reactjs - 在表格中的视图按钮上添加模态
- mysql - 我的Mysql版本是8.0.18,但是不能使用函数JSON_VALUE
- typescript - Vue3 + TS PropType 的泛型
- powershell - 在 Powershell 中无头运行 Selenium 时出现未知错误:net::ERR_CONNECTION_REFUSED
- google-chrome - 带有触摸屏的 Kiosk 模式下的 Chrome
- azure-bot-service - 通过对 Web 应用程序的 IP 限制允许 Web App Bot 和 Direct Line