glDrawBuffers应该翻转IntBuffer?

时间:2015-04-01 17:45:44

标签: java opengl lwjgl framebuffer fbo

我有以下代码:

  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天,我最好的选择是这部分代码在某种程度上是错误的,其余的似乎没问题。

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

1 个答案:

答案 0 :(得分:2)

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

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

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