どうやらこれはTextureBuffer-Objectではなく、Texture-BufferObject という意味であるとのことです。そしてこれは、VBO(Vertex buffer object)のバッファデータをテクスチャとして利用するための仕組みであるとのことです。
テクスチャのデータは glTexImage系の関数で準備をしますが、TBOについてはあくまでバッファオブジェクトなので glBufferData などでデータを転送します。そして転送後はこのバッファをテクスチャデータの供給元とすべく、テクスチャのIDとの関連付けを行います。これらの作業をコードで示すと以下のような感じになります。
glGenTextures( 1, &tex ); // テクスチャオブジェクト // テクスチャバッファオブジェクトの準備. glGenBuffers( 1, &texBuf ); glBindBuffer( GL_TEXTURE_BUFFER, texBuf ); glBufferData( GL_TEXTURE_BUFFER, size, data, GL_STATIC_DRAW ); // テクスチャオブジェクトとTBOの関連付け glBindTexture( GL_TEXTURE_BUFFER, tex ); glTexBuffer( GL_TEXTURE_BUFFER, GL_RGBA8, texBuf );
注意点としては、関連付けるテクスチャを GL_TEXTURE_2Dではなく GL_TEXTURE_BUFFER にバインドする点でしょうか。
TBOの特徴
サンプラ不要でデータにアクセスすることが可能となる点が挙げられます。
通常の2Dテクスチャと違って samplerBuffer を使用することや texelFetch でインデックス指定でアクセスすることも違っています。TBOは1次元配列のように使うという感じでしょうか。
個人的に思うのはこれはジオメトリシェーダーからのストリームアウト(Transform feedback)での結果はVBOに書かれます。これをテクスチャとして使いたいケースでもあるのかなと思いました。
あるいは、バッファオブジェクトを作成して何らかのデータを格納しておきたいケースがあるとか。このデータをテクスチャとして参照することで、リードオンリーではあるものの割と大きなテーブルとして利用可能である、とか。
コメント