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 頂点フォーマットの管理
2010/04/10
VAIO Z と OpenGL と最新ドライバ
新型 VAIO Z (VPCZ11) は GeForce GT330M 搭載。
シェーダーユニット数 48、Direct3D 10.1 の ShaderModel4.1 対応で、ゲームにも
開発用にも期待できるスペックです。
・SONY VAIO Z
しかしながら付属の GeForce ドライバは 188.80 と結構前のバージョンでした。
対応している OpenGL も 3.1 で GLSL 1.3 まで。
NVIDIA のサイトでドライバを検索すると GT330M の最新版は 197.16。
これだと OpenGL 3.2 (GLSL 1.5) や OpenCL にも対応できます。
ノート用 GPU で良くあるように、公式サイトのドライバはそのままだとインストール
できませんでした。以前 TouchSmart IQ800 で何度かやったように inf を書き換えてドライバを
インストールしてみました。一応動くもののいくつか不具合が生じます。
●良い点
とりあえず最新版ドライバが動いたこと。
OpenGL 3.2 + GLSL 1.5 のプログラムも動作しました。
●だめだった点
・画面の明るさ調整ができません。backlightwin もだめ。
・再起動するとドライバが認識できなくなります。
どうやら SPEED mode 固定でも起動時は Intel GMA HD で立ち上がるらしく、GeForce
ドライバが専用のものでないため Intel のドライバの方が正しく認識されません。
Aero が無効になるなど中途半端な状態になります。
一応電源を切るまでは使えますが常用は厳しいのでもとに戻しました。
動的な GPU 切り替えを実現するなど、特殊な構造なので仕方ないのかもしれません。
ちなみに STAMINA mode (Intel 側 GPU) だと下記の通り。
最新のドライバを使いたい場合、できるだけ普通のハードを選んだ方が良さそうです。
関連エントリ
・HP TouchSmart IQ800 に GeForce 9600M GS ドライバを入れる
・Windows ノート PC の backlight の明るさ変更方法
シェーダーユニット数 48、Direct3D 10.1 の ShaderModel4.1 対応で、ゲームにも
開発用にも期待できるスペックです。
・SONY VAIO Z
しかしながら付属の GeForce ドライバは 188.80 と結構前のバージョンでした。
対応している OpenGL も 3.1 で GLSL 1.3 まで。
NVIDIA GeForce GT 330M GL_VERSION: 3.1 NVIDIA 188.80 GL_RENDERER: GeForce GT 330M/PCI/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: 1.30 NVIDIA via Cg compiler
NVIDIA のサイトでドライバを検索すると GT330M の最新版は 197.16。
これだと OpenGL 3.2 (GLSL 1.5) や OpenCL にも対応できます。
ノート用 GPU で良くあるように、公式サイトのドライバはそのままだとインストール
できませんでした。以前 TouchSmart IQ800 で何度かやったように inf を書き換えてドライバを
インストールしてみました。一応動くもののいくつか不具合が生じます。
●良い点
とりあえず最新版ドライバが動いたこと。
OpenGL 3.2 + GLSL 1.5 のプログラムも動作しました。
●だめだった点
・画面の明るさ調整ができません。backlightwin もだめ。
・再起動するとドライバが認識できなくなります。
どうやら SPEED mode 固定でも起動時は Intel GMA HD で立ち上がるらしく、GeForce
ドライバが専用のものでないため Intel のドライバの方が正しく認識されません。
Aero が無効になるなど中途半端な状態になります。
一応電源を切るまでは使えますが常用は厳しいのでもとに戻しました。
動的な GPU 切り替えを実現するなど、特殊な構造なので仕方ないのかもしれません。
ちなみに STAMINA mode (Intel 側 GPU) だと下記の通り。
Intel GMA HD GL_VERSION: 2.1.0 - Build 8.15.10.2021 GL_RENDERER: Intel(R) Graphics Media Accelerator HD GL_VENDOR: Intel GL_SHADING_LANGUAGE_VERSION: 1.20 - Intel Build 8.15.10.2021
最新のドライバを使いたい場合、できるだけ普通のハードを選んだ方が良さそうです。
関連エントリ
・HP TouchSmart IQ800 に GeForce 9600M GS ドライバを入れる
・Windows ノート PC の backlight の明るさ変更方法