有名なチュートリアルOpenGL Pixel Buffer Object (PBO)を読みました。サンプル コードを自分のコンピューターでテストしたところ、動作しました (ただし、PBO をオンにしてもパフォーマンスは向上しませんでしたが、少なくとも正しくレンダリングされています)。
問題は、サンプル コードの OpenGL コンテキスト バージョンがかなり古い ( Version: 2.1 INTEL-10.22.29
) ことです。私のプロジェクトの OpenGL コンテキスト バージョンは、version: 4.1 INTEL-10.22.29
拡張機能をサポートしていませんGL_ARB_pixel_buffer_object
。
このマップを読み、PBO (OpenGL 3.3) を使用してテクスチャを塗りつぶしたので、コードを次のように変更します。
// generating buffers and textures
glGenVertexArrays(1, &_vertex_array);
glBindVertexArray(_vertex_array);
glGenBuffers(1, &_vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexs_data), vertexs_data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glGenBuffers(1, &_uv_buffer);
glBindBuffer(GL_ARRAY_BUFFER, _uv_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(uvs_data), uvs_data, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
glGenBuffers(1, &_pixel_buffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _pixel_buffer);
glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, 0, GL_STREAM_DRAW);
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
そしてレンダリングループ:
glBindTexture(GL_TEXTURE_2D, _texture);
// ======== start process PBO =========
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _pixel_buffer);
glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, 0, GL_STREAM_DRAW);
GLubyte *ptr = (GLubyte*) glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_READ_WRITE);
if( ptr != nullptr )
{
cout<<"map pixel buffer success"<<endl;
memcpy(ptr, DATA_SIZE, data );
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
}
// ========= end process PBO ==========
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
_window_width, _window_height,
0, GL_RGB,
GL_UNSIGNED_BYTE, data
);
glGenerateMipmap(GL_TEXTURE_2D);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
// draw commands goes here
私のコードは単色のテクスチャをレンダリングするだけです。ブロックをコメントする======== start process PBO =========
と========= end process PBO ==========
、すべてうまくいきますが、このブロックでは失敗し、黒い画面しか表示されません。私はすでにglMapBuffer
正しく動作することを確認しており、テクスチャデータを が指すメモリに正常に書き込んでいますptr
(その値を出力してチェックしています)が、期待した結果が得られなかった理由がわかりません。
前もって感謝します。
私の環境:
OS: macOS sierra 10.12.3 (16D32)
Graphics: Intel Iris Graphics 6100 1536 MB