cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

openFrameworksのshaderでGLSL4.2のatomic counter bufferを使って画素の数をカウントしてみる(その3)

普段使用している開発環境ではnVidiaグラフィックカードを使用しているのですが、intel製グラフィックスチップの環境にこのコードを持っていくと動かないことが分かりました。
原因を調査したところ、shader側ではなくopengl側のbufferのbindの仕方が問題のようです。

software.intel.com

一部引用すると、

// 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だと動かないとかいうオチがありそう。