【发布时间】:2015-03-02 20:51:20
【问题描述】:
我创建了一个使用 OpenGL 的延迟渲染器,它似乎只适用于一帧。然后它只呈现黑色。对于下面的代码,我已经将渲染的架构扁平化了很多,但我认为所有相关的内容都包括在内。如果需要更多上下文,您可以查看here。
这第一部分在程序初始化时运行:
// corresponds to deferredRenderer.Bind();
glViewport(0, 0, display.GetWidth(), display.GetHeight());
glClearColor(0, 0, 0, 1);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glDepthFunc(GL_LEQUAL);
然后循环开始。首先渲染器被绑定到对象/材质通道:
// corresponds to deferredRenderer.BindForObjectPass();
gBuffer.BindAsDrawFrameBuffer();
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
然后为每个对象运行这段代码(每个对象都有自己的着色器):
materialShader.Bind();
diffuseTexture->Bind(0);
shader.SetUniform("u_diffuse", 0);
glm::mat4 modelViewMatrix = camera.GetViewMatrix() * transform.GetModelMatrix();
glm::mat4 projectionMatrix = camera.GetProjectionMatrix();
materialShader.SetUniform("u_model_view_matrix", modelViewMatrix);
materialShader.SetUniform("u_projection_matrix", projectionMatrix);
glBindVertexArray(vertexArray);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
在渲染完所有对象后,光通道开始。在这个开发阶段,它只是一个带有硬编码灯光的着色器:
// corresponds to deferredRenderer.RenderLightPass();
display.BindAsDrawFrameBuffer();
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT);
screenSpaceShader.Bind();
gBuffer.GetAlbedoTexture().Bind(10);
screenSpaceShader.SetUniform("u_albedo", 10);
gBuffer.GetNormalTexture().Bind(11);
screenSpaceShader.SetUniform("u_normals", 11);
glBindVertexArray(vertexArray);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 8);
glBindVertexArray(0);
最后把backbuffer切换到最前面:
SDL_GL_SwapWindow(window);
在此之后,渲染器再次绑定对象传递并继续循环。
请注意,第一帧完全按照它应该的方式呈现,所以我认为可以安全地假设它至少在某种程度上是正确的。它在一整帧后发生变化的事实也告诉我,它可能与 gl 状态在第一次循环后处于奇怪状态有关。我还确保 gBuffer 渲染缓冲区是完整的,因此 不应该 成为问题
【问题讨论】:
标签: c++ opengl rendering sdl sdl-2