只是想确保我理解正确(我会问SO聊天,但它已经死了!):
我们有一个顶点数组,我们通过绑定它来制作"当前"
然后我们有一个缓冲区,我们绑定到一个目标,
然后我们填充该目标,通过glBufferData
该目标基本上填充绑定到该目标的任何东西,即我们的缓冲区
然后我们调用glVertexAttribPointer哪个描述数据是如何布局的 - 数据是绑定的任何数据GL_ARRAY_BUFFER
,这个描述符保存到我们原始的顶点数组中
(1)我的理解是否正确?关于一切如何相关
的文档有点稀疏.
(2)是否存在某种默认的顶点阵列?因为我忘了/省略了glGenVertexArrays,glBindVertexArray没有它我的程序运行正常.
编辑:我错过了一步...... glEnableVertexAttribArray.
(3)当时glVertexAttribPointer是否调用与顶点数组绑定的顶点属性,然后我们可以随时启用/禁用该属性glEnableVertexAttribArray,无论当前绑定哪个顶点数组?
或者(3b)当时glEnableVertexAttribArray是否调用与顶点数组相关联的顶点属性,因此glEnableVertexAttribArray当绑定不同的顶点数组时,我们可以通过在不同时间调用将相同的顶点属性添加到多个顶点数组?
glVertexAttribPointer应该调用何时从文档中看不出来.看起来它是VBO初始化的一部分,但我注意到在渲染过程中调用它的示例代码.
glVertexAttribPointer(vertexAttributeId, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), reinterpret_cast<const GLvoid*>(offsetof(Vertex2D, m_x)));
应该glVertexAttribPointer在初始化期间调用,GL_ARRAY_BUFFER还是应该在渲染期间调用(调用之后glBindBuffer)?
我已经学习OpenGL三天了,我可以完成任务,但我觉得在不知道自己在做什么的情况下复制粘贴.我认真地思考我缺少什么时候恰好是基本的了解什么(VBO,属性,...)绑定到一个顶点数组对象(VAO),并没有发现明确将详细介绍这些方面的任何资源.
特别是,这些是我的一些问题.如果我创建一个VAO:
GLuint vao;
glGenVertexArrays(1, &vao);
Run Code Online (Sandbox Code Playgroud)
在绑定VAO之前,任何东西都可以绑定它吗?(如果我现在创建一个VBO,它是否绑定到VAO?)
glBindVertexArray(vao);
Run Code Online (Sandbox Code Playgroud)
绑定VAO后,如果我创建一个VBO:
GLuint vbo;
glGenBuffers(1, &vbo);
Run Code Online (Sandbox Code Playgroud)
是否与VAO绑定?或者它绑定它时会发生吗?
glBindVertexArray(vbo);
Run Code Online (Sandbox Code Playgroud)
或者也许当我复制一些东西时?
如果我得到属性位置:
att = glGetAttribLocation(program_id, "name");
Run Code Online (Sandbox Code Playgroud)
是否与VAO绑定?或者在启用它后会发生:
glEnableVertexAttribArray(att);
Run Code Online (Sandbox Code Playgroud)
......或者在设置之后:
glVertexAttribPointer(att, ...);
Run Code Online (Sandbox Code Playgroud)
?
我猜EBO的行为与VBO一样,所以我希望同样的"规则"适用.
制服应该像全局一样,所以它们不应该受到VAO的影响.
现在,关于解除绑定:
如果我将VBO"绑定"到VAO,然后取消绑定VBO,它是否会与VAO分离?
如果我有一个绑定到多个VAO的VBO,当我取消绑定VBO时会发生什么?
关于释放资源:
删除VBO后会发生什么?是否会从所有VAO中删除?或者他们仍然对VBO有"悬挂参考"?
关于节目:
IIUC我可以在程序之间重用VBO.但是,如果VAO绑定属性和VBO,并且属性采用程序参数,我可以在程序之间重用VAO吗?为什么属性会占用程序参数?
关于调试:
有没有办法漂亮打印OpenGL状态机?我想知道一种方法来了解已经链接的程序,哪些着色器,哪些VAO在哪里,哪些VBO绑定到哪些VAO,哪些属性被绑定到哪些VAO和VBO,它们是否被设置?他们启用了吗?有哪些制服......
关于绘图电话:
假设某人给了我一个VAO,我必须画它.有没有办法知道我是否应该调用glDrawArrays或glDrawElements?我能以某种方式从VAO查询这些信息吗?也许随着我的VBO的大小存储在那里?
我很困惑如何在不同的多个程序之间正确切换.我把问题缩小到以下几点:如果我用NO_HDR运行,它运行正常; 我得到了一些线,太空船和一些球,按顺序渲染.如果我使用HDR运行,我会得到大部分相同的东西,但不是球体,我得到2d正方形.
我认为来自hdr部分的四重顶点属性会覆盖在forwardRender()部分中渲染的最后一些内容.如果我在forwardRender()中更改顺序,则在forwardRender()中最后呈现的内容将以某种方式搞砸.我错过了什么,允许四边形顶点覆盖我的其他对象?
#if NO_HDR
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
forwardRender();
#else
//set to render to custom frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, rt.FramebufferName);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
forwardRender();
//now switch to render to screen
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, rt.renderedTexture);
glUseProgram(hdr.shaderProgram);
glUniform1i(texID, 0);
glBindBuffer(GL_ARRAY_BUFFER, hdr.quad_vertexbuffer);
glEnableVertexAttribArray(hdr.quad_vertexPosition_modelspace);
glVertexAttribPointer(
hdr.quad_vertexPosition_modelspace, // attribute
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the triangles !
glBindVertexArray(hdr.vao);
glDrawArrays(GL_TRIANGLES, 0, 6); // …Run Code Online (Sandbox Code Playgroud)