我读过,VBO(顶点缓冲区对象)本质上保留了一个引用计数,因此,如果将 VBO 的名称指定给 ,那么glDeleteBuffers()如果活动的 VAO(顶点数组对象)仍然引用它,它就不会真正被忽略。这种行为类似于越来越多的新语言采用的“智能指针”。但在多大程度上这是正确的并且可以围绕它进行设计,以及它是否也适用于 IBO(索引缓冲区对象),我还没有找到任何相关信息。
如果一个 VBO 被引用它的 VAO 保持存活,并且我不打算在 VAO 死亡后更新它或使用它,我认为最好的做法是销毁我对它的引用。这样做合适吗?我可以对 IBO 做同样的事情吗?
所以我一直在https://open.gl/上学习OpenGL 3.3 ,我对一些东西感到很困惑.
glVertexAttribPointer呼叫.最重要的是这一切如何适合大型项目?究竟是什么用于VAO-s?大多数教程只是为了绘制一个立方体或2个带有硬编码顶点的东西,那么如何管理具有大量对象的场景呢?我已经阅读了这个帖子并且对场景管理的发生方式有了一些了解,但我仍然无法弄清楚如何将OpenGL的东西连接到它.
我可以获得更全面/一般的描述吗?
我整个星期都在尝试研究这些东西,但我只涉及超级技术解释或示例。
有人可以解释一下这些 VAO 的总体流程或目标吗?也许概述一下在 OpenGL 中设置 VAO 的“分步”流程图?
我从来都不是一个通过例子学习的人……所以到目前为止,我在网上找到的所有东西都没有什么帮助。
我试图了解 OpenGL 顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个二维矩形和一个二维三角形
const GLfloat rect[] = {
-0.5f, 0.5f,
0.5f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f};
const GLfloat tri[] = {
0.0f, 1.0f,
0.5f, 0.5f,
-0.5f, 0.5f};
Run Code Online (Sandbox Code Playgroud)
我将它们放在不同的顶点缓冲区对象中,并尝试将它们映射到顶点数组对象的索引,以便前 3 个属性来自三角形,接下来的 2 个属性来自矩形的最后 2 个点。然后我把它们画成三角形条。
GLuint vbo[2];
glGenBuffers(2, vbo);
GLuint varr;
glGenVertexArrays(1, &varr);
glBindVertexArray(varr);
// draw triangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(tri), tri, 0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// draw rectangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(rect), rect, 0);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
glEnableVertexAttribArray(3);
glDrawArrays(GL_TRIANGLE_STRIP, …Run Code Online (Sandbox Code Playgroud)