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 状态?
36059 是 0x8CD8,即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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
在这种情况下我应该什么时候进行边缘翻转? (对于Delaunay三角测量)