我尝试将渲染的图像存储到带有glReadPixels的PBO中,然后使用glMapBuffer将像素传输到我的ByteBuffer对象中。
但是在update()完成后,缓冲区只包含我调用glBufferData(...)时传递的虚拟数据。所以我假设glReadPixels无法将数据加载到PBO中。我在glReadPixels(...)之后得到错误1282(INVALID_OPERATION)。
如果我尝试将像素直接读入缓冲区,它会按预期工作(尽管错误仍然存在)。但是出于性能原因,我后来想先调用glMapBuffer(...)然后调用glReadPixels(...),这样我就可以对数据处理进行平行处理。
public ModelObserver() {
buffer = BufferUtils.createByteBuffer(Display.getWidth() * Display.getHeight() * 4);
for (int i = 0; i < Display.getWidth() * Display.getHeight(); i++) {
buffer.put(new byte[] { 0, 127, 0, 0 });
}
buffer.flip();
pixelData = GL15.glGenBuffers();
glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelData);
glBufferData(GL_PIXEL_PACK_BUFFER, buffer, GL_DYNAMIC_READ);
}
public void update() {
glReadBuffer(GL_FRONT);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelData);
glReadPixels(0, 0, Display.getWidth(), Display.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, 0);
System.out.println(glGetError());
glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelData);
glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, buffer);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
}
答案 0 :(得分:0)
根据LWJGL documentation,您对glMapBuffer()
的使用不正确。引用文档,引用第三个参数:
只有从此方法返回的ByteBuffers将作为old_buffer参数传递。用户创建的ByteBuffers无法重复使用。
这意味着将buffer
变量作为第三个参数传递无效。正确的用法是:
ByteBuffer resBuffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, null);
然后您可以从resBuffer
读取结果。如果您稍后再次进行相同类型的glMapBuffer()
调用,现在可以传入此缓冲区以便重复使用:
resBuffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, resBuffer);