我有以下代码:
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)
?
答案 0 :(得分:2)
底层GL API需要一个带有Java缓冲区的函数的数组。该数组的大小是GL的C语言绑定中的一个参数,但在Java中是隐藏的,因为LWJGL将其计算为当前位置和结束位置之间的差异。
除非你翻转java.nio.Buffer
,否则会设置&#34;当前&#34;位于缓冲区的开头,调用put (...)
后,当前位置将成为结束位置。因此,LWJGL将一个大小 0 的数组传递给它所在的基于C的OpenGL API。如果您拨打glDrawBuffers (...)
,其大小为 0 ,则会将所有内容设置为GL_NONE
,这肯定会产生您所描述的行为。