今回気になってと色々と試していたのは、テクスチャへのレンダリングについてです。
■ 背景
比較的新しい環境で、NVIDIA/AMDなどのグラフィックチップを使っている物については、FBO(FramebufferObject)の使用で簡単に対応可能です。
しかしたまにFBOを使えない環境という状況についてどうしようということがあります。
FBOはOpenGLの3系で初めてコアに取り込まれていたので、
OpenGL 2.1対応のビデオボードというだけでは、使えない可能性もあります。
(拡張でつかえることも当然ある。ドライバの完成度次第です)
今までは、「そんな環境は知らない。」としていたのですが、
- 意外にも旧Intel Coreシリーズの内蔵グラフィックチップがOpenGL 2.1止まりである
- Intelのグラフィックチップではかなりの世代がOpenGL対応バージョンが低いままである
という点から、このまま放置はダメだと思い、ちょっと調べてみることにしました。
■ 調査
出典は英語のほうのWikiPediaより。
チップ | OpenGL対応具合 | 備考 |
---|---|---|
GMA 900 | 1.4 | |
GMA 950 | 1.4 | |
GMA 3100 | 1.5 | |
GMA 3150 | 1.5 | |
GMA X3500 | 2.0 | G35のもの |
GMA X4500 | 2.1 | G4xあたり |
HD Graphics | 2.1 | 旧Intel Core iシリーズ. |
HD Graphics 2000 | 3.0 | 新Core iシリーズ |
HD Graphics 3000 | 3.0 | 新Core iシリーズ |
ざっと、このような状況でした。
まだまだGMA3000番代を使っている環境も多いと思うので、
ここの対応を切ってしまうのはやはり不味そうです。
手元にGMA950のノートPCがあるので、これを実験対象として用いてみたいと思います。
■ 実験中
今の世代を考慮して、シェーダーの使用は前提とします。
その場合に必要となる関数として以下のものを読み込んだのですが、エラーに。
- glVertexAttribPointer
- glEnableVertexAttribArray
- glDisableVertexAttribArray
色々と調べてみると、末尾に”ARB”が付いているものを使用しなくてはならないようです。
この末尾になにもないタイプは、OpenGL 2.0でのコア関数に位置づけされるものっぽいです。
これらのことを考えると、2.0未満の場合では末尾にARBが付いている物を使い、
それ以外の場合には、何も付いていないものを使用するべきのように思います。
さて、そのようにして作業を進めていくと驚くべき事実が発覚。
GMA950のOpenGL 1.4の環境では、GLSLが使用不可能でした…。
あれ?と思って調べてみると、GLSLではなくARBのシェーダーが使えるようです。
DirectXでもHLSLの前はシェーダーアセンブラでしたし、これと同じ状況です。
結果、この環境でシェーダーが動くためには、GLSLではなくアセンブラ形式のシェーダーを使う必要があるということでした。
シェーダー使用の前提を保ちつつ、レンダーテクスチャ(のようなもの)をサポートするには、
かなり厳しい道のりがありそうです。
とりあえず、HLSLで書いたコードをNVIDIAが提供しているCg Toolkitを用いて、
OpenGL ARB用のシェーダーアセンブラを出力することが可能です。
ここではこの助けを借りて、もうちょっとがんばってみようと思います。