OpenGL transform feedbackの使い方で最近は少し変わって便利に使えるようになったようです。前回、書き込んだプリミティブ数をCPUで取得していましたが、これが不要となるようです。いわゆるDirectX の DrawAuto っぽいものがOpenGLでも実現できるようになりました。
使い方は、以下のような感じです。ポイントは GL_TRANSFORM_FEEDBACK のオブジェクトを使うというところです。ここに対してバッファの制御をさせるようなそんな感じです。バッファのバインドが GL_TRANSFORM_FEEDBACK_BUFFER に対して行うところもポイントです。
// 開始 glBindTransformFeedback( GL_TRANSFORM_FEEDBACK, transformFeedback ); glBindBufferBase( GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo ); glBeginTransformFeedback( GL_POINTS ); glDrawArrays(GL_POINTS, 0, vertexCount ); glEndTransformFeedback(); // 元に戻す glBindTransformFeedback( GL_TRANSFORM_FEEDBACK, 0 ); // 書き込んだ分を描画 glDrawTransformFeedback( GL_POINTS, transformFeedback );
ここの transformFeedback 変数は、 glGenTransformFeedbacks 関数で準備しておきます。
クエリを発行する部分が消え去って、すっきりとした印象を受けます。
ただこのglDrawTransformFeedback関数ですが、最近のOpenGL 4.0 をサポートするドライバがインストールされていないと使えないようです。4.0をサポートしていても使えないことがあるとか。ただ GL_ARB_transform_feedback2 拡張に本関数は定義されているようです。