OpenGL (Open Graphics Library) について
OpenGLは、Khronos Groupが策定した、グラフィックス
ハードウェア向けの2次元/3次元
コンピュータグラフィックスライブラリです。元々はSGI社内で開発されたクローズドなAPIでしたが、改良を経て公開され、広く利用されるようになりました。現在では、多様な描画デバイスを包括するグラフィックスAPIの
オープン標準規格として策定されています。
概要
OpenGLは、SGIをはじめ、
[ヒューレット・パッカード]、
[サン・マイクロシステムズ]、
IBM、SONY-NEWSなどの
UNIXワークステーションや、
Linux、FreeBSDなどのPC
UNIX、さらにはWindows、macOSといった
クロスプラットフォームな環境で利用できます。また、モバイルデバイスや家電向けのOpenGL ES規格や、航空機や車載システム向けのOpenGL SC規格も存在します。
オープン標準として公開されているため、幅広い処理系に対応し、家庭用から業務用まで広く普及しています。描画デバイスの実装を抽象化することで高い移植性を実現し、GPUによる
ハードウェアアクセラレーションによって高速な描画が可能です。また、有償・無償の豊富な補助ライブラリが利用できます。これにより、個人でも無料のソフトウェアのみでGPUの能力を活用した3Dプログラミング環境を構築でき、3次元
コンピュータグラフィックスの学習や研究、
クロスプラットフォームなソフトウェア開発に適しています。
OpenGL APIは
C[[言語]]関数群の形で提供され、仕様はクロノスグループがドキュメントとC/
C++用のヘッダーファイルとして公開しています。Fortranや
Javaなど他の
言語向けのラッパーも存在します。OpenGLの実装は、主に
ハードウェアベンダーやOSが提供する
デバイスドライバーです。
歴史と進化
初期のOpenGLでは
[テクスチャマッピング]]が標準サポートされておらず、ゲーム開発に必要なエフェクト処理のサポートが不足していました。OpenGL 2.0でシェーディング言語]が標準化されましたが、DirectXと比べて標準化が遅れる傾向がありました。しかし、OpenGL 4.0以降はGPUの進化に合わせてAPIの対応が進み、DirectX 11と同等の機能が提供されています。ただし、設計思想の違いから完全な移植性はなく、性能は[[ハードウェアやドライバーの最適化レベルに依存します。
近年、OpenGLは根本的なAPI設計が古く、最新の
CPUやGPUの性能を十分に引き出せないという問題が指摘されています。後継のVulkanの登場以降、OpenGLのバージョンアップはほとんど行われていません。また、特定のプラットフォーム専用APIの方が性能や安定性の面で有利なため、OpenGLは非推奨扱いになる環境も存在します。
OpenGL対応デバイスでも、最新機能が使えるとは限りません。また、DirectXと比較して同世代のOpenGLへの対応が遅れる場合もあります。
設計思想
OpenGLは元々、CAD/
CAM/CAEなど正確・高精度なモ
デル描画を最優先とする
ワークステーション向けのグラフィックスAPIでした。ジオメトリ処理を専用チップに実行させることで高速描画を実現し、CADや3次元可視化などの業務用に強いとされてきました。一方、Direct3Dはゲームグラフィックス用途に最適化されており、描画結果の正確性よりも速度が優先されていました。しかし、現在ではDirect3Dも高精度・高安定性を実現しており、業務用のアプリケーションでもDirect3Dのみをサポートするケースが増えています。
PCゲーム開発でもOpenGLが利用されるようになり、モバイルOS向けのOpenGL ESはコードの相互移植を容易にします。ただし、Windows以外のプラットフォームではVulkanやMetalといった後発のローレベルAPIへの移行が進んでいます。
クロスプラットフォームなアプリケーションフレームワークでもOpenGLが使われることが多いですが、最新のフレームワークでは、OSごとのデフォルトレンダリングバックエンドとして、Direct3DやMetalなどのAPIが採用されています。
標準化と拡張
OpenGLは、SGIのIRIS GLを基に開発され、OpenGL Architecture Review Board (ARB) を経て、現在はKhronos Groupが管理しています。オープンな仕様のため、各種OSへの移植や互換GLが作成され、グラフィックチップベンダーもオープンソースOS用のドライバーを提供しています。ベンダー独自の機能は拡張として柔軟に対応でき、最新技術をいち早く利用できる一方で、汎用性の低いアプリケーションも開発可能です。
OpenGLの標準化はDirectXに比べて遅い傾向がありましたが、近年は更新頻度が高まり、DirectXと同等の機能が提供されるようになっています。
特徴
OpenGLは、画面(フレームバッファ)への描画を前提としており、
ポリゴンのラスタライズにより3DCGを描画します。鏡面反射や屈折、半透明表現など高度な表現には、独自のアルゴリズム実装が必要です。
デプスバッファ、ステンシルバッファ、蓄積バッファなどの特殊な画素情報がサポートされ、柔軟な画像処理が可能です。プログラマブルシェーダーとGLSLの採用により、多種多様な表現が可能になりました。
ポイントスプライト機能により、パーティクルや2次元オブジェクトの3次元空間への合成が容易になります。ただし、OpenGL 2.xまでの上位レベル機能は廃止予定となっています。
コード例とプログラミング
OpenGLはC/
C++で利用され、ユーザーメモリやGPU側のバッファを利用して高速な描画が可能です。プログラマブルシェーダーを利用するには、GLSLでシェーダープログラムを作成する必要があります。
補助・拡張ライブラリ
OpenGLは低次のライブラリであるため、高次の補助・拡張ライブラリが多数存在します。これらは、3D描画の簡略化、ウィンドウシステムサポート、その他の機能追加などに利用されます。
C/C++向け: GLU, GLX, WGL, EGL, GLUT, FreeGLUT, GLUI, AUX, GLee, GLEW, GLFW, GLUS, GLM, OpenSceneGraph, FLTK, Open Inventor, ToGL, SDLなど
その他
言語向け: OpenTK (C#), JOGL (
Java),
Java 3D, LWJGL (
Java)など
WebGLは
JavaScript向けの別規格であり、OpenGLの単なるラッパーではありません。OpenGLには公式のSDKや開発者向けソフトウェアスイートは提供されていませんが、各ベンダーが独自のSDKを提供している場合があります。
Microsoft Windows SDKにはOpenGL 1.1のヘッダーとライブラリが含まれています。
バージョンの変遷
OpenGL 1.1: テクスチャに対応。Windowsの標準ドライバーでサポート。
OpenGL 1.5: プログラマブルシェーダー向けの高級
[言語]に対応。
OpenGL 2.x: GLSL 1.1が標準仕様に。Direct3D 9世代に相当。
OpenGL 3.x: APIのシェイプアップ。固定機能シェーダーが非推奨に。Direct3D 10世代に相当。
OpenGL 4.x: テッセレーションやコンピュートシェーダーを搭載。Direct3D 11世代に相当。
Vulkanへの移行
OpenGLの設計が古くなったため、次世代の標準3D API規格としてVulkanが開発されました。Vulkanは、マルチスレッド対応や中間[[言語]]SPIR-Vなどの近代的な技術を導入しており、OpenGLよりもハードウェアに近い制御を可能にします。ただし、習得難易度が高く、コード量が増えるというデメリットもあります。OpenGLは今後もメンテナンスされますが、バージョンアップは停止しています。
問題点
OpenGLは古いAPI構造を踏襲しており、Direct3Dと比較して仕様が洗練されていません。また、Direct3Dは公式ドキュメントが充実しており、習得しやすいとされています。OpenGLの弱点として、以下の点が挙げられます。
文字列の描画: 専用のAPIがないため、テクスチャやプラットフォーム依存のAPIを利用する必要がある。
マルチGPU: 複数のGPUを効率的に利用する機能が標準化されていない。
コンピュート機能: レンダーコンテキストが必要なため、完全なオフスクリーンでの利用が難しい。
マルチスレッド: マルチスレッドを活用した描画パフォーマンス向上が難しい。
ドライバー品質とGLSLコンパイラー: ドライバーの品質がベンダーや製品によって異なり、GLSLコンパイラーの挙動も処理系依存である。
DirectXとの関係
DirectXはゲーム開発向けに、グラフィックスだけでなくサウンドや入力関連のAPIを含みます。OpenGLと直接比較されるのはDirect3Dです。DirectXは主にWindowsや
Xboxで利用され、OpenGLは
クロスプラットフォームな環境で利用できます。業務用では、OpenGLが利用されることが多いですが、後発のローレベルAPIの登場により、OpenGLのサポートを打ち切るケースも出てきています。
OpenCLは、異種計算資源混在環境(ヘテロジニアス環境)用の並列コンピューティングAPIであり、OpenGLとは相補的な関係にあります。
macOSでの非推奨化
AppleはmacOSでOpenGL/
OpenCLを非推奨とし、代わりにMetalを推奨しています。
ARM版Windowsでの利用
ARM版Windowsでは、OpenGL 1.2以降の機能が利用できません。Microsoftは互換機能パックを提供していますが、OpenGL 3.3以前のAPI互換機能にとどまります。
まとめ
OpenGLは、歴史のあるグラフィックスAPIですが、Vulkanなどの後継APIに移行する動きが進んでいます。しかし、豊富なライブラリや
クロスプラットフォームな対応など、依然として多くの利点があります。今後の動向に注目が必要です。
参考文献
OpenGL公式サイト(英語)
Khronos Group
OpenGL Programming Guide
OpenGL Reference Manual