glDrawBuffers 应该翻转 IntBuffer 吗?

Posted

技术标签:

【中文标题】glDrawBuffers 应该翻转 IntBuffer 吗?【英文标题】:glDrawBuffers should have flipped 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 错误而不是数字?我猜他们是。 【参考方案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()了,谢谢:)

以上是关于glDrawBuffers 应该翻转 IntBuffer 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Qt中的OpengL glDrawBuffers()?

链表翻转

在这种情况下我应该什么时候进行边缘翻转? (对于Delaunay三角测量)

UICollectionView 单元格没有选择翻转动画,视图丢失

如何创建动画翻转箭头动画

我应该垂直翻转加载了 stb_image 的图像的线条以在 OpenGL 中使用吗?