は、クロノス・グループ () が策定している、グラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスライブラリである。SGI社内で自社のCGワークステーション向けにクローズドに策定されたAPI仕様が改良されて公開され、後に大きなシェアを持つに至った。現在は多様な描画デバイスを包括するグラフィックスAPIのオープン標準規格として策定が行なわれている。

概要

OpenGLは、SGIをはじめ、ヒューレット・パッカード (HP)、サン・マイクロシステムズ(現オラクル)、IBM、SONY-NEWSなどのUNIXワークステーションのほか、Linux、FreeBSDなどのPC UNIXに加え、Windows、macOS等で使用できるクロスプラットフォームなグラフィックスAPIである。また、モバイルデバイスや家電など組み込み用途向けのサブセット版であるOpenGL ES (OpenGL for Embedded Systems) 規格も存在する。そのほか、航空機や車載ソリューションといったセーフティクリティカルシステム向けの規格も存在するOpenGL SC Overview - The Khronos Group Inc。

オープン標準として公開され、幅広い処理系に対応しているため、家庭用・業務用問わず広く普及している。描画デバイスの実装を隠蔽する抽象化層として機能するため、移植性が高い。また、描画演算処理をOpenGLに対応する専用ハードウェア (GPU) に委ねることで非常に高速に動作し(ハードウェアアクセラレーション)、CPUのみによるソフトウェア描画と比較して高いフレームレートを維持したまま高解像度かつ複雑な3Dグラフィックスをリアルタイム描画できる。有償・無償の豊富な補助ライブラリがあることも特色として挙げられる。Windows, Mac OS, Linux, BSD等の様々なオペレーティングシステム (OS) の上で利用可能であり、個人でも無料のソフトウェア群のみでGPUの能力を活用した3Dプログラミング環境を整備できる。開発・実行環境として広範なプラットフォームをサポートすることから、3次元コンピュータグラフィックスの学習や学術研究、クロスプラットフォームなクローズドソース/オープンソースソフトウェア開発などにも適している。

OpenGL APIはC言語関数群の形で提供され、またクロノスグループが策定・公開しているのは、OpenGL API仕様のドキュメントおよびC/C++用のヘッダーファイルだが、FortranやJavaなどの他言語向けのラッパー/バインディングも存在するOpenGL Overview。OpenGLの実装は、主にハードウェアベンダーまたはオペレーティングシステム (OS) によって提供されるデバイスドライバーである。

OpenGLの最初の仕様では、テクスチャマッピングが標準的にサポートされておらず、1997年のOpenGL 1.1でようやく拡張機能から必須機能に格上げとなるなど、ゲーム開発によく使われるようなエフェクト処理のサポートが弱かった。2004年に発表されたOpenGL 2.0で高水準シェーディング言語 (GLSL) を標準化したが、その後もDirectX (Direct3D) と比べて標準化が遅く、必須機能としてのサポート追加は数年遅れとなることが多かった。しかし、OpenGL 4.0のリリース以降はGPUの進化に合わせたOpenGL APIの対応が進み、主要な機能に関しては、OpenGL 4.3以降とDirectX 11 (Direct3D 11) 以降との差異はほとんど無くなっている。とはいえ、OpenGLとDirect3Dは、その設計思想の違いから1対1で対応するものではないため、移植性は完全ではなく、また性能面ではハードウェアおよびドライバーのOpenGL/Direct3D最適化レベルに依存するQuadroとGeForceの違い |菱洋エレクトロ株式会社, Internet Archiveため、利用分野やプラットフォームに応じた住み分けも依然として根強く残っている。

しかし、OpenGLは根本的なAPI設計が古く、すでに最新のCPUやGPUの性能を十分に引き出すことができなくなっており、またデバイスドライバー実装の品質管理などにも問題を抱えている。2016年に後継のVulkanが発表された後は、OpenGLのバージョンアップはほとんどなされていない。また、標準化に時間のかかるオープン仕様のAPIよりも、MetalやDirect3Dといった特定のプラットフォーム専用APIのほうがOSのアーキテクチャと親和性の高い独自機能あるいは先進的機能を導入しやすく、性能や安定性の面でも有利であるため、OpenGLは非推奨扱いになったり、ドライバーが提供されなくなったりしている環境も存在する。後述の#Vulkan、#macOSでの非推奨化、#ARM版Windowsでの利用も参照のこと。

なお、例えばOpenGLプログラマブルシェーダーを利用するには特定のバージョン以降のOpenGLに対応したハードウェアが必要であるなど、OpenGL対応を謳っているデバイスでも最新のOpenGL機能が使えるとは限らない。また、Intel GMAやIntel HD Graphicsなどのように、DirectX 9.0c(シェーダーモデル3.0)には対応するがOpenGL 2.0には対応しなかったり、DirectX 10(シェーダーモデル4.0)には対応するがOpenGL 3.2には対応しなかったり、DirectX 11(シェーダーモデル5.0)には対応するがOpenGL 4.3には対応しなかったり、さらにはOSによってOpenGLの対応バージョンに違いがあったりホイール欲しい ハンドル欲しい » Intel HD Graphics 4000 GPU と OpenGLと、DirectXと比べて同等世代のOpenGLへの対応が遅い環境も存在する。

もともとOpenGLはワークステーション発祥のグラフィックスAPIであり、工業製品などの設計・製造の過程で用いられるCAD/CAM/CAEで必要となる正確・高精度なモデル描画を最優先の用途としていた。また、ポリゴンの頂点座標変換や陰影計算などのジオメトリ処理を当初からグラフィックス処理専用チップに実行させることが前提であったため、OpenGL対応ハードウェアを利用することで大量のポリゴンの高速な描画を実現することができた。一方、Direct3Dでは当初ジオメトリ処理にCPUを用いており、ハードウェアT&Lに対応したのは1999年リリースのDirect3D 7以降である。またDirect3Dは正確性よりも描画速度が優先されるゲームグラフィックス用途に最適化されていたため、きわどい位置でポリゴンが交差した場合など、描画結果が正確でない場合があった。そのため、利用者からはOpenGLのほうがCADや3次元可視化などの業務用に強いという見方がなされていた。

業務用の製品として、正確なモデル描画や安定した動作を保証したビデオカード(グラフィックスカード)が存在し、これらは主にハードウェアやデバイスドライバーがOpenGLに最適化されていることが謳われている。ただし、Direct3D 11.xとOpenGL 4.xの違いはすでにほとんどなくなっており、Direct3Dであってもドライバーレベルの対応によってOpenGL同様の高精度・高安定性を実現できるようになっていること、またDirect3D 12に至っては両者をしのぐ機能や速度性能を実現していることから、業務用のアプリケーションソフトウェアであってもWindowsではOpenGLによる描画モードのサポートを終了し、Direct3Dのみをサポートする事例も増えている。詳細は後述の#DirectXとの関係を参照のこと。

のちにWindowsだけでなくmacOSやLinuxなどにも移植あるいはマルチプラットフォーム展開されるPCゲーム開発でもOpenGLが利用されるようになったValveはなぜSource EngineをLinux+OpenGL環境へ移植したのか。GTC 2013のValveセッションレポート。AndroidやiOSといったモバイルOSで利用可能なOpenGL ESは、OpenGLと類似のAPIであり、異なるOS間でコードを相互移植・流用しやすいというメリットもある。しかし、Windows以外のプラットフォームでもVulkanやMetalといった後発のローレベルAPIによる置き換えが進んでいる。Linux上でWindowsアプリケーションを直接実行させるためのWindows APIエミュレーションレイヤーであるWineでは、従来はDirect3D互換実装のバックエンドにOpenGLが使われていたが、Vulkanをバックエンドに使うライブラリも開発されている第35回 Days of WINE and Struggles again[4] | gihyo.jpLinux版SteamにVulkan対応のWine実装でWindowsゲームもプレイ可能に - PC Watch。Unreal EngineやUnityといったゲームエンジンでは、ゲーム開発者はグラフィックスAPIを直接利用する必要がなく、実行環境に応じて自動的に最適なAPIによるレンダリングバックエンド実装が使われるが、従来のOpenGL/OpenGL ESに加えてローレベルAPIのサポートも追加されているUnreal Engine 5.0 リリース ノート | Unreal Engine 5.0 ドキュメンテーション | Epic Developer CommunityUnreal Engine の Linux の開発要件 | Unreal Engine 5.4 ドキュメンテーション | Epic Developer Communityグラフィックス API サポート - Unity マニュアルMetal - Unity マニュアル。

クロスプラットフォームなアプリケーションフレームワークでも3Dグラフィックス機能のサポートにOpenGLが使われることが多く、例えばQtはバージョン5.xまでOpenGLに依存していたが、バージョン6.0にてWindowsではDirect3Dを、macOSではMetalをデフォルトのレンダリングバックエンドとして利用する抽象化レイヤーが導入されたQt Platform 6.0 Released | Embedded Systems Development Platform | QtQt6.0をリリースしました | Qt Group 日本オフィス。

歴史 元々はSGIが自社ワークステーションで使用していたというライブラリを改良し、移植性を高めたものである日本SGI - OpenGL, Internet Archive。

1992年以降は、OpenGL Architecture Review Board (ARB) により監修されることとなる。このARBには、3Dlabs、Apple、AMD(旧ATI)、デル、エバンス・アンド・サザランド(E&S)、HP、IBM、インテル、Matrox、NVIDIA、シリコングラフィックス、サン・マイクロシステムズ(現オラクル)が参加している。2006年9月21日以降からは、100以上の企業で構成される標準化団体クロノス・グループ (The Khronos Group) へ管理が移行し、OpenGL ARB Working Group (OpenGL ARB WG) となった。

オープンな仕様であるため、各種OSに移植または互換GLが作成され、またグラフィックチップベンダーもオープンソースOS用のドライバーを用意するなど汎用性に富むライブラリとなっている。ベンダー独自の機能にも、「拡張」(Extension)という形で柔軟に対応できるため、いち早く最新の3Dグラフィックスハードウェアによる先進技術を利用できる反面、ハードウェアを限定した汎用性のないアプリケーションも開発できてしまう。ベンダー拡張の中には、のちに標準仕様として取り込まれたものもある。

OpenGLの標準化はDirectX (Direct3D) と比較すると遅い傾向にある。OpenGL 3.0以降、仕様の更新頻度は高まり、テッセレーションの標準化(DirectX 11.0とOpenGL 4.0)に関してはリリース時期にそれほど時間差はなかったが、コンピュートシェーダーの標準化(DirectX 11.0とOpenGL 4.3)に関しては時間差が大きかった。しかし、OpenGLのほうが先行して導入・標準化し、のちにDirectXが追従した機能もいくつか存在する[SIGGRAPH]ついにDirectX 11を凌駕した!? Khronosに聞く「OpenGL 4.2」の正体 - 4Gamer.net。やのようにOpenGL/OpenGL ESでしかサポートされていないものもあるOpenGLはDirectX 11を超え,OpenGL ESは据え置き型ゲーム機と同等以上に。Khronosの最新動向レポート - 4Gamer.net。

特徴

thumb|right|450px|OpenGL 2.x以前のグラフィックスパイプライン処理の図 OpenGLは画面(フレームバッファ)に描画することを前提に設計されている。3DCGを描画できると言っても、オフラインレンダラー(POV-Rayなど)のようなレイトレーシング法は標準ではサポートされておらず、ポリゴンなどのプリミティブ形状をリアルタイムに順序をもってラスタライズ(画素化)して合成することで3DCGを描画する。そのため、形状同士が反映し合うような鏡のような反射、ガラスの屈折、投影、交差した半透明形状などを表現するには、そのためのアルゴリズムを実装する必要がある。効率良く描画を行わせるためには、アルゴリズムの特性を理解した高度なプログラミングが必要とされる。

柔軟な画像処理を行うために、奥行き情報を記録してZバッファ法などに利用できる「デプスバッファ」、形状のインデックスを記録してマスク処理などを行える「ステンシルバッファ」、高精度なカラー合成などを行える「蓄積バッファ」など、特殊な画素情報がサポートされている。また、元来OpenGLやGPU内で固定的に処理されてきた頂点データやフラグメント(ラスタライズにより生成される画素)の処理をGPUの強力な処理能力を活かしつつプログラミング可能にするプログラマブルシェーダーの登場と、それを制御するシェーディング言語GLSLの採用により、さらに多種多様な表現が可能になった。

また、OpenGL 2.0ではパーティクル機能を主眼に置いたポイントスプライトをサポートしている。一般的にパーティクルや2次元画像のオブジェクトを3次元空間に合成する場合は、平板なポリゴンにテクスチャを張り、常に視点と平行になるよう調整する「ビルボード」と呼ばれる手法が使われているが、ポイントスプライトを使うことでビルボードに代わり、座標計算やプログラミングのコストを軽減できる。

なお、OpenGL 2.xまではプリミティブの描画を記録・再生するDisplay Listと呼ばれる機能や、Begin/Endブロックによるプリミティブ描画コマンドのCPUベース記述モードといった上位レベル機能が存在したが、OpenGL 3.0のコアプロファイルでは廃止予定の非推奨機能となったThe OpenGL® Graphics System: A Specification (Version 3.0 - August 11, 2008), Mark Segal, Kurt Akeley; Editor (version 1.1): Chris Frazier; Editor (versions 1.2-3.0): Jon Leech; Editor (version 2.0): Pat Brown。

コード例 C/C++向けのOpenGLコード例を示す。 OpenGL 2.xまでの固定機能で三角形を描画する例。 // Direct3D デバイス/デバイスコンテキストとは異なり、 // 描画ターゲットとなる OpenGL レンダリングコンテキストは暗黙のグローバルステートとなっており、 // 関数引数に対して明示的に指定しない。 // コンテキストはスレッドローカル変数として管理される。 // https://www.khronos.org/opengl/wiki/OpenGL_Context glDisable(GL_LIGHTING); glBegin(GL_TRIANGLES); { glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, +1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(-1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(+1.0f, 0.0f); } glEnd(); 他にも、ユーザーメモリ頂点配列/エレメント配列(CPU側データ)や、頂点バッファ/エレメントバッファ(GPU側データ)を利用した、より高速な描画方法がある。なお、Direct3Dの頂点宣言・頂点レイアウトに似た機能として Vertex Array Object (VAO) および Vertex Attribute Vertex Specification - OpenGL Wikiが存在するが、Direct3Dのように頂点バッファと頂点属性を完全に分離して扱えるものではない。頂点宣言・頂点レイアウトの互換機能 GL_ARB_vertex_attrib_binding GL_ARB_vertex_attrib_binding | Khronosが標準化されているのはOpenGL 4.3/ES 3.0以降であるホイール欲しい ハンドル欲しい » OpenGL ES 3.0 / OpenGL 4.3 VertexArrayObject と VertexAttribBinding。

プログラマブルシェーダー プログラマブルシェーダーを利用する場合は、GLSL言語等を使いシェーダープログラムを別途作成して、glUseProgram()関数を使ってあらかじめレンダリングコンテキストにプログラムオブジェクトをセットしてから描画関数を呼び出す必要がある。

補助・拡張ライブラリ OpenGLそのものは、ハードウェアおよびデバイスドライバー層に近い低次のライブラリである。そのため、よりアプリケーションソフトウェア層に近い、多くの高次の補助・拡張ライブラリが存在する。主に、3D描画機能を簡易化・拡張するもの、ウインドウシステムをサポートするもの、グラフィックス面以外の機能を付加するものに分けられる。

C/C++向け - カメラや球、円筒、曲面などの取り扱いを補助する GLX - X Window SystemでOpenGLを利用するためのライブラリ - Microsoft WindowsでOpenGLを利用するためのライブラリ (Windows APIおよびGDIの一部) , , NSOpenGL (Cocoaの一部) - macOSでOpenGLを利用するためのライブラリ - OpenGL ES, といったKhronosの描画APIと、下層のプラットフォーム固有ウィンドウシステムをつなぐインターフェイスEGL Overview - The Khronos Group Inc GLUT - クロスプラットフォームのOpenGL対応ウィジェット・ツールキット - GLUTの機能を強化した、上位互換ライブラリThe freeglut Project :: About - GLUTをベースにしたウィジェットライブラリ AUX - ウィジェット・ツールキットであるが、古くなっておりGLUTの使用が推奨されている - OpenGL拡張の使用を容易にするライブラリ。開発は停止しており、公式バージョンの配布もされていないOpenGL Loading Library - OpenGL WikiSLUDGE Adventure Game Engine - Home。 - GLSLなどのOpenGL拡張の使用を容易にするライブラリGLEW: The OpenGL Extension Wrangler Library。OpenGL 4.6に対応。 - クロスプラットフォームのOpenGL対応フレームワークツールキットGLFW - An OpenGL library。OpenGL ESおよびVulkanにも対応。 GLUS (Graphic Library UtilitieS) - 公式のクロスプラットフォームなユーティリティ。OpenGL ESにも対応 GLUS - Modern OpenGL, OpenGL ES and OpenVG Utilities now part of the OpenGL SDK - khronos.org news OpenGL Mathematics (GLM) - GLSLライクに記述できるC++向けの算術ライブラリOpenGL Mathematics OpenSceneGraph FLTK - クロスプラットフォームのOpenGL対応ウィジェット・ツールキット Open Inventor ToGL - Valve Softwareが開発した、Direct3DからOpenGLへの変換レイヤーValveSoftware/ToGL: Direct3D to OpenGL abstraction layer SDL - クロスプラットフォームなマルチメディアライブラリ

その他の言語向け C/C++以外の主要なOpenGL言語バインディング(ラッパー)とライブラリには以下のようなものがある。 - C#向けのローレベルなOpenGL/OpenGL ES/OpenALバインディングThe Open Toolkit | OpenTK Java OpenGL (JOGL) - Java向けのバインディング Java 3D - JOGL上に構築されるJava向けのシーングラフベース上位レベルライブラリ LWJGL - Java向けのゲーム開発用ライブラリ

その他の言語バインディングについては、Language bindings - OpenGL Wikiを参照のこと。

なお、WebGLはJavaScript向けの単なるラッパーや言語バインディングではなく、OpenGL ES派生の別規格である。

DirectXやVulkanとは異なり、具体的な公式ソフトウェア開発キット (SDK) や開発者向けのソフトウェアスイートは提供されていない。KhronosによるOpenGL SDKのサイトでは、APIリファレンスへのリンクや、補助ライブラリおよび開発ツールへのリンクが記載されているのみであるOpenGL SDK | LibrariesOpenGL SDK | Tools。NVIDIAのように、自社GPU向けのOpenGL拡張ヘッダーや開発ツールを含むSDKを提供しているベンダーもあるOpenGL | NVIDIA Developer。Microsoft Windows SDKにはWGLとともに、OpenGL 1.1およびGLUのヘッダーとインポートライブラリが含まれているOpenGL Reference - Win32 apps | Microsoft Learn。

バージョンの変遷 OpenGL 1.1 テクスチャに対応。Windowsの標準ドライバーおよびWGLで標準サポートされているのは、このOpenGL 1.1であるOpenGL - Windows applications | Microsoft Docs。

OpenGL 1.5 2003年にリリースされたOpenGL 1.5では、拡張機能としてプログラマブルシェーダーのための高級言語(GLSL 1.0)に初めて対応した"The OpenGL(R) Graphics System: A Specification (Version 1.5)", p.294。

OpenGL 2.x 2004年にリリースされたOpenGL 2.0では、シェーディング言語GLSLのバージョン1.1対応が標準仕様として盛り込まれた。

全般的な機能はDirect3D 9のシェーダーモデル2.0および3.0世代に相当する。

OpenGL 3.x 2008年にリリースされたOpenGL 3.0では、肥大化したOpenGL APIセット自体のシェイプアップを目的として2.x以前の世代を切り捨てる大幅なアップデートが行われ、多くの機能が非推奨・廃止予定になった。翌2009年3月に発表されたOpenGL 3.1では固定機能シェーダーが標準仕様から取り除かれ、拡張機能扱いとなった(GL_ARB_compatibility)。また同年8月に発表されたOpenGL 3.2では、コアプロファイルと互換プロファイルの概念が導入されたほか、Direct3D 10で導入されたジオメトリシェーダーに正式対応したT.Teranishi:OpenGL:version。互換プロファイルでは固定機能シェーダーが含まれるように再定義されたが、互換プロファイルをサポートするかどうかは実装に依存する。

固定機能シェーダーの廃止やジオメトリシェーダーの対応などは、Direct3D 10の仕様と合致しており、シェーダーモデル4.x世代に相当する。

OpenGL 4.x 2010年3月11日に OpenGL 4.0 を発表Khronos Unleashes Cutting-Edge, Cross-Platform Graphics Acceleration with OpenGL 4.0 - Khronos Group Press Release。Direct3D 11のハル シェーダー、テッセレータおよびドメイン シェーダーに相当する、テッセレーション制御シェーダー、テッセレーション プリミティブ ジェネレーターおよびテッセレーション評価シェーダーが搭載されたGame Developers Conference(GDC) 2010現地レポート - GAME Watch。

2010年7月26日に OpenGL 4.1 を発表Khronos Drives Evolution of Cross-Platform 3D Graphics with Release of OpenGL 4.1 Specification - Khronos Group Press Release。シェーダープログラムバイナリの取得やビューポート配列の対応など。

2011年8月8日に OpenGL 4.2 を発表Khronos Enriches Cross-Platform 3D Graphics with Release of OpenGL 4.2 Specification - Khronos Group Press Release。シェーダーにおけるアトミックカウンターの実装など。

2012年8月6日に OpenGL 4.3 を発表Khronos Group Announces Key Advances in OpenGL Ecosystem - Khronos Group Press Release。Direct3D 11のコンピュート シェーダーと同様のGPGPU用演算シェーダーが追加搭載された。また、次世代テクスチャ圧縮技術であるのサポートが公式拡張として定義されたKhronos Releases ASTC Next-Generation Texture Compression Specification - Khronos Group Press Release。