2010/04/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 そのものです。
関連エントリ
・OpenGLES 2.0 頂点フォーマットの管理
必要なのは頂点フォーマットの定義と、各要素が対応する頂点シェーダー入力のシンボル名。
これらのバインド情報は 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 頂点フォーマットの管理