2010/07/31
OpenGL 4.1 GeForce GTX 460
買ってきました。
早速 OpenGL 4.1 対応ドライバ 259.09 入れています。
D3D11 の caps は RADEON HD 5870 とほとんど同じで、RADEON + D3D11 用に
作ったプログラムもそのまま動作しました。
Feature で Driver Command Lists のみ No になっている点も RADEON と同じです。
OpenGL 4.1 はとりあえず初期化だけ。
まだヘッダがありませんが Shader のバイナリフォーマットも
こんな感じで取れました。
関連エントリ
・OpenGL 4.1 と OpenGL ES 2.0
早速 OpenGL 4.1 対応ドライバ 259.09 入れています。
D3D11 の caps は RADEON HD 5870 とほとんど同じで、RADEON + D3D11 用に
作ったプログラムもそのまま動作しました。
Feature で Driver Command Lists のみ No になっている点も RADEON と同じです。
OpenGL 4.1 はとりあえず初期化だけ。
まだヘッダがありませんが Shader のバイナリフォーマットも
const int GL_NUM_PROGRAM_BINARY_FORMATS= 0x87fe; const int GL_PROGRAM_BINARY_FORMATS= 0x87ff; GLint bin_nums= 0; glGetIntegerv( GL_NUM_PROGRAM_BINARY_FORMATS, &bin_nums ); GLint param[max_formats]; glGetIntegerv( GL_PROGRAM_BINARY_FORMATS, param ); for( int i= 0 ; i< bin_nums ; i++ ){ GLint bin_format= param[i]; .. }
こんな感じで取れました。
GL_VERSION: 4.1.0 GL_RENDERER: GeForce GTX 460/PCI/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: 4.10 NVIDIA via Cg compiler NUM_PROGRAM_BINARY_FORMATS = 1 PROGRAM_BINARY_FORMAT = 8e21 NUM_COMPRESSED_TEXTURE_FORMATS = 3 COMPRESSED_TEXTURE_FORMAT = 83f0 COMPRESSED_TEXTURE_FORMAT = 83f2 COMPRESSED_TEXTURE_FORMAT = 83f3 [GL_ARB_ES2_compatibility] [GL_ARB_get_program_binary] [GL_ARB_robustness] [GL_ARB_separate_shader_objects] [GL_ARB_shader_precision] [GL_ARB_vertex_attrib_64bit] [GL_ARB_viewport_array]
関連エントリ
・OpenGL 4.1 と OpenGL ES 2.0
2010/07/30
OpenGL 4.1 と OpenGL ES 2.0
OpenGL の動きが活発です。
OpenGL 4.0/3.3 のリリースが今年の 3月。
早くも OpenGL 4.1 が出ました。
・OpenGL Registry
NVIDIA のサイトにはすでに GeForce (Fermi) 系向けのドライバもあります。
・NVIDIA OpenGL 4.1 driver
OpenGL は 3.x で徐々に新しい機能セットに移行し、従来との互換性は Profile
指定による互換モードで保っています。
互換性の枷がなくなったことで新機能への追従が容易になったのでしょう。
DirectX に比べて遅れていた機能面の取り込み速度が格段に早くなっています。
4.0 以降、Direct3D 11 との機能差はほぼなくなっているようです。
DirectX も細かな改良は定期的な DirectX SDK のリリースで続けられていますが、
世代の変化は OS の更新と同調する必要もあり、ここしばらく core には目立った
動きもありませんでした。
むしろ Game Console が D3D9 世代ということもあり、さらに XP の制限も
あったため、API が完全刷新された Direct3D 10 への移行すらあまり積極的に
進んでいない状況です。
その点 OpenGL の方が世代間を移行しやすいので、D3D10/D3D11 相当の機能は
OpenGL の方がより広く使われることになるかもしれません。
もう一つ OpenGL の勢いを決定づけた点がモバイル向け API OpenGL ES の存在です。
すでにモバイル向け 3D API の標準は OpenGL ES 2.0 だと断言して構わないでしょう。
DirectX Mobile は固定機能の D3D8 ベースから更新されておらず、
WindowsPhone 7 でも XNA を通したサブセットで、シェーダーどころかさらに機能
制限される形になりそうです。モバイル向け GPU も進化し続けていますが、
その可能性を引き出せる API にはならないようです。
モバイル開発との相互移植性の高さは OpenGL の魅力の一つです。
この点は十分認知されているようで OpenGL 4.1 ではさらに OpenGL ES 2.0 との
互換 Profile が追加されました。考えられるメリットは下記の通り。
・HW 機能の再現が不要なら Emulator 無しに GL core だけで動作確認できる
・相互移植のしやすさ、desktop 向け OpenGL ES 2.0 アプリの開発
これまでもデスクトップで動作する OpenGL ES 2.0 Emulator が各 GPU メーカー
から公開されています。それぞれ完成度が高く、アプリがすんなり動いていたので
このままリリースしてもいいのではないかと疑問をいだいていたのも事実。
● OpenGL の問題点や Direct3D との違い
すっかり OpenGL / OpenGL ES 2.0 を使う機会が多くなりました。
とはいえ D3D11 にも良い点がかなりあります。
今後それぞれ改良されていくものと思われます。
以下いくつか問題と感じていた点。
・コンパイラ互換性
DirectX は OS 間の互換性を保つことが出来ませんが、そのかわり GPU の違いは
かなり吸収してくれます。
特にシェーダーコンパイラは共通バイトコードが定義されており、どの GPU でも
MS 製の同じコンパイラでバイナリ化出来ます。
OpenGL の GLSL コンパイラは GPU ドライバ依存なので、言語仕様の小さな差異が
問題になることがあります。
同じ C++ 言語でも VC と gcc で違いがあるように、GPU メーカー毎に異なる
コンパイラが存在しているからです。
・エラーコード
Direct3D 10 以降のエラーメッセージに慣れていると OpenGL API のエラーコードに
戸惑います。GL_INVALID_ENUM 等の数種類のコードの使い回しなので、すぐに問題を
特定することが出来ません。慣れかもしれませんが、この点は Direct3D の方が
ずっと分かりやすいし親切だといえます。
・シェーダーコンパイル時間
GLSL はアプリケーション起動のたびに毎回コンパイルが必要でした。
OpenGL 4.1 ではシェーダーを独立してバイナリ化するための専用 API が追加
されているので、今後解決していくものと思われます。
・テクスチャ圧縮フォーマット
Direct3D で当たり前に使える DXT/BC のありがたみがよく分かります。
・スレッド対応
OpenGL の場合自分で工夫する必要あり。
Direct3D 11 が便利すぎたので。
関連エントリ
・OpenGL 4.0 / OpenGL 3.3
OpenGL 4.0/3.3 のリリースが今年の 3月。
早くも OpenGL 4.1 が出ました。
・OpenGL Registry
NVIDIA のサイトにはすでに GeForce (Fermi) 系向けのドライバもあります。
・NVIDIA OpenGL 4.1 driver
OpenGL は 3.x で徐々に新しい機能セットに移行し、従来との互換性は Profile
指定による互換モードで保っています。
互換性の枷がなくなったことで新機能への追従が容易になったのでしょう。
DirectX に比べて遅れていた機能面の取り込み速度が格段に早くなっています。
4.0 以降、Direct3D 11 との機能差はほぼなくなっているようです。
DirectX も細かな改良は定期的な DirectX SDK のリリースで続けられていますが、
世代の変化は OS の更新と同調する必要もあり、ここしばらく core には目立った
動きもありませんでした。
むしろ Game Console が D3D9 世代ということもあり、さらに XP の制限も
あったため、API が完全刷新された Direct3D 10 への移行すらあまり積極的に
進んでいない状況です。
その点 OpenGL の方が世代間を移行しやすいので、D3D10/D3D11 相当の機能は
OpenGL の方がより広く使われることになるかもしれません。
もう一つ OpenGL の勢いを決定づけた点がモバイル向け API OpenGL ES の存在です。
すでにモバイル向け 3D API の標準は OpenGL ES 2.0 だと断言して構わないでしょう。
DirectX Mobile は固定機能の D3D8 ベースから更新されておらず、
WindowsPhone 7 でも XNA を通したサブセットで、シェーダーどころかさらに機能
制限される形になりそうです。モバイル向け GPU も進化し続けていますが、
その可能性を引き出せる API にはならないようです。
モバイル開発との相互移植性の高さは OpenGL の魅力の一つです。
この点は十分認知されているようで OpenGL 4.1 ではさらに OpenGL ES 2.0 との
互換 Profile が追加されました。考えられるメリットは下記の通り。
・HW 機能の再現が不要なら Emulator 無しに GL core だけで動作確認できる
・相互移植のしやすさ、desktop 向け OpenGL ES 2.0 アプリの開発
これまでもデスクトップで動作する OpenGL ES 2.0 Emulator が各 GPU メーカー
から公開されています。それぞれ完成度が高く、アプリがすんなり動いていたので
このままリリースしてもいいのではないかと疑問をいだいていたのも事実。
● OpenGL の問題点や Direct3D との違い
すっかり OpenGL / OpenGL ES 2.0 を使う機会が多くなりました。
とはいえ D3D11 にも良い点がかなりあります。
今後それぞれ改良されていくものと思われます。
以下いくつか問題と感じていた点。
・コンパイラ互換性
DirectX は OS 間の互換性を保つことが出来ませんが、そのかわり GPU の違いは
かなり吸収してくれます。
特にシェーダーコンパイラは共通バイトコードが定義されており、どの GPU でも
MS 製の同じコンパイラでバイナリ化出来ます。
OpenGL の GLSL コンパイラは GPU ドライバ依存なので、言語仕様の小さな差異が
問題になることがあります。
同じ C++ 言語でも VC と gcc で違いがあるように、GPU メーカー毎に異なる
コンパイラが存在しているからです。
・エラーコード
Direct3D 10 以降のエラーメッセージに慣れていると OpenGL API のエラーコードに
戸惑います。GL_INVALID_ENUM 等の数種類のコードの使い回しなので、すぐに問題を
特定することが出来ません。慣れかもしれませんが、この点は Direct3D の方が
ずっと分かりやすいし親切だといえます。
・シェーダーコンパイル時間
GLSL はアプリケーション起動のたびに毎回コンパイルが必要でした。
OpenGL 4.1 ではシェーダーを独立してバイナリ化するための専用 API が追加
されているので、今後解決していくものと思われます。
・テクスチャ圧縮フォーマット
Direct3D で当たり前に使える DXT/BC のありがたみがよく分かります。
・スレッド対応
OpenGL の場合自分で工夫する必要あり。
Direct3D 11 が便利すぎたので。
関連エントリ
・OpenGL 4.0 / OpenGL 3.3