我正在使用JOGL在Java中使用OpenGL做一些事情,我遇到了让我感到惊讶的事情。
有两个glReadPixel函数指向相同的C实现。
第一个是:
glReadPixels(int x, int y, int width, int height, int format, int type, Buffer pixels)
我理解它与C绑定相比如何工作,但第二个:
glReadPixels(int x, int y, int width, int height, int format, int type, long pixels_buffer_offset)
如何将void *转换为long?我们真的在很长时间内获得像素吗?
我真的不明白第二个绑定。我做了一些谷歌搜索,我发现每个人都在使用第一个...
答案 0 :(得分:1)
如果要将结果读入PBO(像素缓冲区对象),将使用第二个绑定。在这种情况下,最后一个参数是缓冲区的偏移量。如果缓冲区绑定到GL_PIXEL_PACK_BUFFER
,则glReadPixels()
的最后一个参数指定相对于此缓冲区开头的偏移量。
这与glVertexAttribPointer()
非常相似,其中最后一个参数在C / C ++绑定中被重载,但Java需要两个绑定,因为它更安全。在这种情况下,如果存在GL_ARRAY_BUFFER
绑定,则最后一个参数是相对于VBO开头的偏移量,否则它是指向数据的指针。