OpenGL只渲染第一帧然后渲染黑度

时间:2015-03-02 20:51:20

标签: c++ opengl rendering sdl sdl-2

我使用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渲染缓冲区已完成,因此不应该成为问题

1 个答案:

答案 0 :(得分:0)

我通过使用一些调试工具修复它,告诉我导致错误的gl调用。

问题是,因为我在初始化列表中将它初始化在堆栈上,所以一旦着色器被构造就意外地被破坏了。问题中的所有代码都应该正常工作。