Я пытаюсь прочитать содержимое обратного буфера в моем собственном буфере. glReadPixels
сам по себе слишком медленный и снижает мой FPS от 50 до 30.Быстрый просмотр буфера чтения OpenGL
Итак, я решил попробовать «асинхронный» читать с помощью PBuffer, но он сработает.
Мой код выглядит следующим образом:
Если буферы не существует, создайте их. В противном случае, читать задний буфер в указанное место памяти:
static int readIndex = 0;
static int writeIndex = 1;
static GLuint pbo[2] = {0};
void FastCaptureBackBuffer()
{
//Create PBOs:
if (!initBuffers)
{
initBuffers = true;
glGenBuffers(2, pbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[0]);
glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 1.0f, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[1]);
glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 1.0f, 0, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
}
//swap read and write.
writeIndex = (writeIndex + 1) % 2;
readIndex = (writeIndex + 1) % 2;
//read back-buffer.
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[writeIndex]);
glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, nullptr);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[readIndex]);
void* data = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if (data)
{
memcpy(myBuffer, data, width * height * 4);
data = nullptr;
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
}
Тогда я:
BOOL __stdcall HookSwapBuffers(HDC DC)
{
FastCaptureBackBufferPBO();
return CallFunction<BOOL>(GetOriginalAddress(353), DC);
}
Таким образом, каждый раз, когда приложение вызывает wglSwapBuffers
, я прочитал назад буфер прямо, пока он не поменяны местами.
Как я могу быстро прочитать задний буфер? Что мне не хватает в приведенном выше?
В идеале я хотел: указать указатель, который может отображать игра непосредственно, вместо экрана, а затем я могу вручную отображать содержимое памяти.
Любой другой способ, и я в конечном итоге копирую задний буфер в блок памяти, и он медленный.
Любые идеи?
Просто FYI: PBuffers - это нечто совсем иное, чем Pixel Buffer Objects. PBuffer - это особый вид выведенного из экрана экрана (вид окна, который нельзя сделать видимым). PBuffers использовались для внеэкранного рендеринга, прежде чем появились объекты Framebuffer (FBOs). – datenwolf