toge's diary

コンピュータ関連の趣味をつらつらと。

PBOってもしかしていまいち?

うーん、こうではなくて。

glGenBuffers(1, &pboID);

glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pboID);
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width_ * bpp, NULL, GL_STREAM_DRAW);

for (int y = 0; y < height_; ++y)
{
  buffer = (unsigned char*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);
  png_read_row(png_, buffer, NULL);
  glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB);		      

  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, y, width_, 1, upload, type, 0);
}

glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);		
glDeleteBuffers(1, &pboID);	  

こうしたいんですけど。

glGenBuffers(1, &pboID);

glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, pboID);
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width_ * bpp, NULL, GL_STREAM_DRAW);

buffer = (unsigned char*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY);

for (int y = 0; y < height_; ++y)
{
  png_read_row(png_, buffer, NULL);
  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, y, width_, 1, upload, type, 0);
}

glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB);		      

glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);		
glDeleteBuffers(1, &pboID);	  

書けても良さそうなものなんだけどな・・・。そんなに甘くないですか。
PBO使うことでかえって遅くなりそう・・・。