【问题标题】:glDrawBuffers should have flipped IntBuffer?glDrawBuffers 应该翻转 IntBuffer 吗?
【发布时间】:2015-04-01 17:45:43
【问题描述】:

我有以下代码:

  IntBuffer DrawBuffers = Utils.createIntBuffer(2);
  int bfs[] = {GL30.GL_COLOR_ATTACHMENT0, GL30.GL_COLOR_ATTACHMENT1};
  for(int i = 0; i < 2; i++)
      DrawBuffers.put(bfs[i]);
  DrawBuffers.flip();
  GL20.glDrawBuffers(DrawBuffers);

如果我翻转IntBuffer,那么int Status = GL30.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); 不等于GL_FRAMEBUFFER_COMPLETE,如果我不翻转它,那么我的状态是正确的,但是我得到的是黑色纹理而不是所需的纹理,我现在一遍又一遍地查看我的代码 2 天,我最好的选择是这部分代码有某种错误,其余部分似乎还可以。

glDrawBuffers(IntBuffer) 中使用之前是否应该翻转IntBuffer

【问题讨论】:

  • 翻转缓冲区时会得到什么状态?
  • 如果我不得不猜测的话,可能是GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER
  • 我得到:int Status = 36059,如何获得 GL_FRAMEBUFFER_STATUS 形式的 gl 状态?
  • 360590x8CD8,即GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT。老实说这很奇怪,因为这个错误并没有进入最终的 FBO 规范。无论如何,当您查找错误代码时,请始终查找十六进制的错误编号。
  • 是否在任何文件中指定了错误,以便我的应用可以打印 gl 错误而不是数字?我猜他们是。

标签: java opengl lwjgl framebuffer fbo


【解决方案1】:

是的,所有缓冲区都应该在传递给 LWJGL 之前翻转。

底层 GL API 需要一个数组来存储采用 Java 缓冲区的函数。该数组的大小在 GL 的 C 语言绑定中是一个参数,但在 Java 中对您隐藏,因为 LWJGL 将其计算为当前位置和结束位置之间的差异。

除非您翻转java.nio.Buffer,它将“当前”位置设置为缓冲区的开头,否则当前位置将是调用put (...) 后的结束位置。因此,LWJGL 将一个大小为 0 的数组传递给它所在的基于 C 的 OpenGL API。如果您使用大小 0 调用 glDrawBuffers (...),它会将所有内容设置为 GL_NONE,这肯定会产生您所描述的行为。

【讨论】:

  • 所以我应该在最后一次 put(..) 之后通过它?
  • @user5819:您必须在最后一个put (...) 之后调用flip (...)。没有它,缓冲区中的当前位置将是结束位置,LWJGL 不会复制任何数据。
  • 好的,现在我明白为什么我必须调用flip()了,谢谢:)
猜你喜欢
  • 2010-12-16
  • 2016-07-01
  • 2012-05-02
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多