glDrawBuffers 应该翻转了 IntBuffer?

glDrawBuffers should have flipped IntBuffer?

我有以下代码:

  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,如果我不翻转它然后我得到正确的状态,但我得到一个黑色texture 而不是所需的纹理,我一遍又一遍地查看了我的代码 2 天了,我最好的选择是这部分代码在某种程度上是错误的,其余部分似乎没问题。

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

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

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

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