【发布时间】:2014-10-07 04:21:14
【问题描述】:
我对如何在不同的多个程序之间正确切换感到困惑。我已将问题缩小到以下几点:如果我使用 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); // 2*3 indices starting at 0 -> 2 triangles
#endif
另一个线索:如果我在最后 glDrawArrays 之后禁用 vertexAttribArray,我的球体/正方形就会消失!
作为参考,这是我在 forwardRender() 中渲染球体的方式:
glUseProgram(globe.shaderProgram);
glm::mat4 mvp = camera * world * position * size * orientation;
GLint uTransform = glGetUniformLocation(shaderProgram, "transform");
glUniformMatrix4fv(uTransform, 1, GL_FALSE, glm::value_ptr(mvp));
glBindVertexArray(globe.vao);
glDrawArrays(drawType, 0, globe.drawCount);
【问题讨论】: