2015-04-19

現世代のOpenGLで高速にキャプチャするコード(わかる人向け)(暫定版)




bool Copy(GLuint pbo, void* dest, GLuint fbo, GLuint src_tex, GLint x, GLint y, GLsizei width, GLsizei height)
{
 bool ret = false;
 glBindFramebuffer(GL_FRAMEBUFFER, fbo); CHECK_GL_ERROR();
 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, src_tex, 0);
 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
 glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
 glReadPixels(x, y, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
 void* ptr = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
 if (ptr != NULL)
 {
  memcpy(dest, ptr, width * height * 4);
  glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
  ret = true;
 }
 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
 glBindFramebuffer(GL_FRAMEBUFFER, 0);
 return ret;
}


コピー元は何でもいいですが、PBOを使用すると速いというか負荷が少ないです。
4Kで30fpsいけます。SLI環境でしか試してませんが!
普通に、glReadPixelsやglGetTexImageだと謎のストール発生して遅いです。HD程度だと目立ちませんが、4KにもなるとFPSがガタ落ち。
他のバッファでもいけるのかな、種類多すぎなんで色々実験中です。
これが解決するとRadeon環境が遅いという問題も片付く可能性大。
OpenGLってほんと環境依存しまくりなので難しいです。


噂では、OpenGL mantleともに終息して、Vulkanになっていくとか。

0 件のコメント:

コメントを投稿