openFrameworksのshaderでGLSL4.2のatomic counter bufferを使って画素の数をカウントしてみる(その3)
普段使用している開発環境ではnVidiaのグラフィックカードを使用しているのですが、intel製グラフィックスチップの環境にこのコードを持っていくと動かないことが分かりました。
原因を調査したところ、shader側ではなくopengl側のbufferのbindの仕方が問題のようです。
一部引用すると、
// create and configure the Atomic Counter Buffer glGenBuffers(1, &acb); glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, acb); glBufferData(GL_ATOMIC_COUNTER_BUFFER, nCounters * 4, NULL, GL_STATIC_COPY); glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, acb);
glBindBufferではなく、glBindBufferBaseを使っていることが分かります。
書式を習って書き直すと、こんな感じですね。こちらの書き方なら、nVidiaでもintelでも動きました。
// アトミックカウンタバッファの作成 void create(int sz, int idx, int off) { // パラメータの設定 size = sz; // バッファのサイズ index = idx; // マウント先のインデックス offset = off; // マウント先のメモリオフセット data.resize(sz); // バッファの作成 // create and configure the Atomic Counter Buffer glGenBuffers(1, &buffer); glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, index, buffer); glBufferData(GL_ATOMIC_COUNTER_BUFFER, size * sizeof(GLuint), NULL, GL_DYNAMIC_DRAW); glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, index, buffer); }
# でもAMDだと動かないとかいうオチがありそう。