1

有名なチュートリアル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
4

1 に答える 1