日別アーカイブ: 2010年4月11日

RADEON と OpenGL の VertexArrayObject

Direct3D で頂点とシェーダーの対応付けを行うのが InputLayout です。
必要なのは頂点フォーマットの定義と、各要素が対応する頂点シェーダー入力のシンボル名。
これらのバインド情報は ID3D11Device::CreateInputLayout() で作られた
ID3D11InputLayout が保持しています。
描画時に ID3D11DeviceContext::IASetInputLayout() で指定します。

OpenGL/OpenGL ES の場合は glVertexAttribPointer() を使って同様の対応付けを
行います。シェーダーのシンボルに対応した Location 値や各要素の型とサイズを、入力
要素毎に 1つ 1つ指定していきます。

そのままだと不便なので、頂点のバインド情報をまとめて管理できるように InputLayout 相当の
仕組みを作っていました。(過去のエントリ)

GeForce では問題ありませんが最近の RADEON HD 5870 のドライバで
OpenGL 3.2/3.3/4.0 あたりを使おうとするときちんと動作しないことがあります。
原因を調べていたら、OpenGL 3.x にはすでに VertexArrayObject という仕組みが用意
されていることに気がつきました。こちらを使えば RADEON でも正しく動作しました。

VertexArrayObject は、頂点バッファに対する一連の glVertexAttribPointer() を
まとめてオブジェクトとして扱うことができます。
Direct3D の InputLayout そのものです。

GLuint input_layout= 0;
glGenVertexArrays( 1, &input_layout );
glBindVertexArray( input_layout );
glBindBuffer( GL_ARRAY_BUFFER, vertex_buffer );
glVertexAttribPointer( ~ );
~

関連エントリ
OpenGLES 2.0 頂点フォーマットの管理