【问题标题】:OpenGL only renders the first frame then blacknessOpenGL只渲染第一帧然后是黑色
【发布时间】: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


    【解决方案1】:

    我通过使用一些调试工具来修复它,这些工具告诉我是什么 gl-calls 导致了错误。

    问题是着色器在构造时意外被破坏,因为我在初始化列表中的堆栈上对其进行了初始化。问题中的所有代码都应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多