3D-CGプログラミング環境を考えて見る
私自身別にCGに詳しいわけでもなんでもなく、OpenGLあたりをちょっとかじった程度なのですが、OpenGLにいろいろ課題があるのは非常に感じました。
誤解を恐れずに書くなら、OpenGLの当初の思想は、そもそもCGが専門で無い人(GNUplot使う科学者の層とか?)が、単発描画で3D描画をするのを簡単にするためのものが出発点ではないかと思います(私の勝手な理解)。そこにいろいろ後付けしたのですごいことになっている感があります。
あらゆるリソースがコンテキストに紐付けられており、明示的な管理がありません。
前の描画の時に変更した状態が、裏で残るので、次の描画の挙動に影響します(バグの巣窟です)。
全部コンテキストに紐付くという点でグローバル変数1個となんら変わらないので、プログラムの基本である、分割統治法での設計が困難です(バグの巣窟です)
リソースを保有してハンドルに紐付けて明示的管理するという概念が無いので、マルチインスタンスをやるのが大変です(バグの巣窟です)。
マルチスレッドで性能出そうとかするととっても大変です(バグの巣窟です)。
GPUというフィジカルのレイヤーが見えていないので、コンテキストごとに異なるフィジカルを想定するしかないので、同じリソースをコンテキストを超えて共有できないとか(性能が出ない)もあります。
他にも、少し深いことすると性能を出すのが大変です(バグの巣窟です)。
ライブラリごと(プログラマごと)に想定しているGLのバージョンが違っても動いちゃいます(バグの巣窟です)。シェーダープログラミングのバージョンまで混ぜても動きます(別の意味ですごい)。
アプリ書く人だけではなく、ドライバ作る人も大変なようで、ドライバ間の挙動が違ったり、そもそも品質も揺らぎがあるようです。
なので、C言語で言うなら、main関数1個だけでグローバル変数しか使わないようなプログラムしか書かない人にとってはとっても便利。でも、まじめなCGアプリを書く人には結構大変なイメージです。
私が感じたことの原因を非常に分かりやすく、非常に詳しく書いてあるページを見つけました。
https://cpplover.blogspot.jp/2014/05/opengl.html
https://cpplover.blogspot.jp/2014/05/opengl_19.html
https://cpplover.blogspot.jp/2013/09/dolphinopengl.html
うーん、いろいろよく分かる気が。
特に厄介なのが分業のやりにくさでして、あらゆるものがコンテキストに格納されるので、Aという描画ライブラリのコンテキストの不始末が、ずっと後で呼ばれるBという描画ライブラリでの障害となって現れる点です(そしてそれが「OpenGLの正しい仕様」です)。
ライブラリAとライブラリBをそれぞれ違う人や会社に依頼した場合のデバッグの困難さとか容易に想像できると思います。
Bを作っている人は、「お前のところで不具合が出た」といわれて必死に解析と再テストを繰り返すわけですが、そもそもBさんがアクセス可能なコードの中にバグは無いわけですから収拾がつかなくなるわけです。
(政治的力関係次第では、Aのバグを回避するためにBに対策が入って、新たなバグを呼ぶという悪循環に...)
で、なんでそれでもOpenGLを使うかというと、それしか選択肢が無い(DirectX はWindowsでしか動かない)からです。世間ではAndoroidやiOSなどのモバイルフォン向けの比率が高まっており、非Windows対応がどうしても必要なケースがあるわけです。
そもそもプロのCGクリエイターさんはWindowsなんか使わずにMacBookなのでまじめにCGやりたけれればDirectXはなくなっちゃうわけです。
そういった中で、OpenGLの後継のVulkan は非常に期待しているのですが、まだまだ未対応機器が多いのと、AppleがVulkanではなく、Metalを進めるという状況だそうなのでどうしたものやら(MetalVKってのがあるらしいですが)。
ゲーム作るのが目的なら、Unityみたいなこの辺の問題を隠蔽してくれるソフトが使えるのですが、Unityはアプリケーションソフトを書くには不向きなわけです。
となると、アプリケーションソフトの中で、ガリガリCG使うパーツを組み込まないといけない人はどうすりゃいいの?
って話になるわけです。
とはいえいずれ対応機種増えるだろうから、とりあえずVulkan勉強しとこうかな...