java - OpenGL E.S 2.0 在 LibGDX 中串行渲染到两个纹理时如何保持深度缓冲区完好无损?

标签 java libgdx opengl-es-2.0 fbo depth-buffer

我想渲染到也填充深度缓冲区的颜色纹理。然后,我想将其他内容渲染到另一个纹理,但针对第一次渲染的深度缓冲区进行深度测试。

我对将打包深度值写入颜色纹理不感兴趣,我想保留第一次渲染时现有的填充深度缓冲区。全部通过 LibGDX 实现 OpenGL ES 2.0

所以我有一个带有深度缓冲区的 FBO。

  1. 我将单个允许的 COLOR_ATTACHMENT0 设置为 texA
  2. glCheckFramebufferStatus 返回完成
  3. 通过深度测试进行渲染(这会产生我期望的值)
  4. 将 FBO 的 COLOR_ATTACHMENT0 更改为 texB
  5. glCheckFramebufferStatus 返回完成
  6. 使用深度测试进行渲染(这就像第 3 步中的深度不存在一样)

我想我的查询真的是更改 COLOR_ATTACHMENT 是否会清除深度缓冲区?如果不是,我的代码中一定有不同的问题:(

最佳答案

该问题是由一些我没有预料到的 libgdx 行为引起的。 libgdx RenderContext 正在调用“Gdx.gl.glDisable(GL20.GL_DEPTH_TEST);”

如果未提供,libgdx ModelBatch 会为其自身创建一个 libgdx RenderContext 实例。当在 ModelBatch 实例上调用 begin 时,也会在 renderContext 上调用 begin。但前提是批处理创建了它自己的上下文。在 RenderContext 的开头,它禁用并关闭许多 gl 函数,包括深度测试。

解决方案是让您自己创建一个 RenderContext 实例并将其传递给您的 modelBatches。然后将两个模型批处理包装在对渲染上下文的开始结束调用中。请记住在调用批处理之前重新启用 gl 深度测试。

关于java - OpenGL E.S 2.0 在 LibGDX 中串行渲染到两个纹理时如何保持深度缓冲区完好无损?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25596836/

相关文章:

java.time.format.DateTimeParseException : Text '2016-08-30T06:18:17:698-0600' could not be parsed at index 24

java - Appium v​​s Espresso 用于自动化测试框架

java - Libgdx 球赛

java - 如何使用Libgdx Scene2d对话框?

c - OpenGL ES 2.0 : Object flattens as it rotates

java - 当 jar 位于 protected Windows 目录中时无法获取 jar 资源

java - 我们可以用 PowerMock 创建一个模拟的 java.lang.Class 实例吗?

java - 为什么 glDeleteTextures() 在 OpenGL ES 2.0 中有三个参数?

java - LibGDX:在单独的类中创建 GestureListener

ios - 绘制 2D 纹理而不缩放?