OpenGL

は、クロノス・グループ () が策定している、グラフィックスハードウェア向けの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。

 特徴 

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用演算シェーダーが追加搭載された「OpenGL 4.3」および「OpenGL ES 3.0」が発表される | SourceForge.JP Magazine。また、次世代テクスチャ圧縮技術であるのサポートが公式拡張として定義されたKhronos Releases ASTC Next-Generation Texture Compression Specification - Khronos Group Press Release。

2013年7月22日に OpenGL 4.4 を発表Khronos Releases OpenGL 4.4 Specification - Khronos Group Press Release。バッファ制御や非同期クエリ対応などKhronos、シェアード・バーチャル・メモリなどをサポートするOpenCL 2.0 ～OpenGL 4.4の仕様も公開 - PC Watch。

2014年8月11日に OpenGL 4.5 を発表。Direct State Access (DSA) 対応などOpenGL 4.5が正式リリース - Direct State Accessなどを追加 | マイナビニュース。

2015年8月10日にOpenGL 2015 ARB Extensionsとして、OpenGL ES 3.2互換機能やシェーダーの並列コンパイル機能などが拡張として追加されたKhronos Expands Scope of 3D Open Standard Ecosystem - Khronos Group Press Release。

2017年7月31日に OpenGL 4.6 を発表Khronos Releases OpenGL 4.6 with SPIR-V Support - The Khronos Group Inc。SPIR-Vの導入、Vulkan/Direct3Dとの相互運用性の強化など。

以前はOpenGL仕様のアップデートの速度や頻度はDirect3Dに比べて非常にゆっくりとしたものであったが、OpenGL 4の機能の中にはDirect3D 11と同等あるいはそれ以上に素早く追加されたものもある。全般的な機能はシェーダーモデル5.x世代に相当する。

 Vulkan 

SIGGRAPH 2014で、レガシーな設計が蓄積しているOpenGLをリセットし、ゼロから構築し直して刷新する、次世代の標準3D API規格（OpenGL Next Generation, glNext）の策定が始められることがアナウンスされた。このとき、マルチスレッド対応やシェーディング中間言語などの近代的な技術が導入されることが発表されたOpenGL 3Dの次世代規格の策定作業がKhronos Groupの指揮下に始まる…ハードウェア重視、マルチスレッド、共通シェーディング言語など - TechCrunch。

GDC 2015では、新規格の名称が"Vulkan"（ドイツ語で"火山"）となることが発表され［GDC 2015］Khronos，新世代グラフィックスAPI「Vulkan」を正式発表。OpenGL時代のしがらみを捨てた，スリムでハイエンドなAPIに - 4Gamer.net、Direct3D 12同様のコマンドキューベースのマルチスレッドレンダリング機能や、OpenCLとのプログラミング基盤共通化をもたらすSPIR-V中間表現SPIR - The first open standard intermediate language for parallel compute and graphicsを導入することが明らかにされた。また、VulkanにはAMD独自のローレベルグラフィックスAPIであるMantleが要素技術として取り込まれることが発表された［GDC 2015］Khronos，新世代グラフィックスAPI「Vulkan」でAMDの「Mantle」を採用 - 4Gamer.net。

2016年2月16日、Vulkan 1.0の正式仕様がリリースされた新世代の低オーバーヘッドなグラフィックスAPI「Vulkan」，ついに正式始動 - 4Gamer.net。

なお、Vulkanはハードウェアの詳細な制御を可能とするローレベルAPIであるため、習得難易度が高く、アプリケーションコードの記述量が増えるというデメリットも存在する。一方、従来のOpenGLはCPU-GPU間の同期などの煩雑な処理を自動で行なってくれる上位層のAPIであり、Vulkanと比較すれば習得も容易である。膨大な過去のコード資産やノウハウも蓄積されている。そのため、OpenGLは今後もメンテナンスおよびアップデートが継続されることになっているVulkan on NVIDIA GPUs; Piers Daniell, Driver Software Engineer, OpenGL and Vulkan。ただし、2017年にリリースされたOpenGL 4.6を最後にOpenGLのバージョンアップは止まっており、以降は仕様書のメンテナンスだけにとどまっているKhronos OpenGL® Registry - The Khronos Group Inc。

 問題点 
OpenGL 3.xで固定機能を分離するなどのシェイプアップは図られたが、しかしOpenGLは互換性維持という名目で、1.xや2.x時代に設計された古いAPI構造の大部分をいまだに踏襲している。一方で競合APIのDirect3Dは互換性を切り捨てながらも思い切った仕様変更により、APIをその当時の技術トレンドや先進技術に即した形で洗練してきたCarmack: Direct3D is now better than OpenGL | bit-gamer.net。またDirect3Dは公式ドキュメントが充実していることや、習得がしやすいことも評価されているValve: OpenGL is faster than DirectX - even on Windows - ExtremeTech。実際にOpenGL仕様そのものに対して、開発者から不満の声も上がっているRich Geldreich's Tech Blog: Things that drive me nuts about OpenGLOpenGL/ES,GLSLのバグとKhronosの不備 - リンゴをかじれ, Internet ArchiveOpenGL Is Broken – The Burning Basis Vector。ここではOpenGLの弱点や問題点、および不足機能に関して記述する。なお、これらはOpenGLだけでなくOpenGL ESにも共通して言えることである。

 文字列の描画 
OpenGL単体では、WindowsのGDI/GDI+やmacOSのCore Graphicsのような上位レベルの文字列描画用APIが用意されていないOpenGL FAQ / 17 Using FontsOpenGL Programming/Modern OpenGL Tutorial Text Rendering 01 - Wikibooks, open books for an open worldfractious: Rendering Text in OpenGL on Androidため、あらかじめ文字が描画されたテクスチャを（画像ファイルから読み込むなどして）利用するか、プラットフォーム依存の上位レベルAPI（例えばWindowsの場合はwglUseFontOutlines()関数wglUseFontOutlinesW function (wingdi.h) - Win32 apps | Microsoft Learnなど）と連携する必要がある（クロスプラットフォームのユーティリティライブラリであるGLUTなどを使用すると、文字・文字列を描画することができるが、その機能はごく限られており、あくまでデバッグ用途などの簡易的なサポートにとどまる）。NVIDIA拡張としてはGL_NV_Path_RenderingGL_NV_path_rendering | Khronos Registry - The Khronos Group IncGL_NV_path_rendering | NVIDIANVIDIA、ついにAdobe Illustrator CCの GPUアクセラレーション対応を発表|NVIDIANV Path Rendering | NVIDIA Developerが存在し、高度なプリミティブ描画のGPUアクセラレーションやフォントもサポートするが、標準化はされていない。

なお、Direct3Dも同様に文字列描画が弱点であるが、Microsoft Windows 7に搭載されたDirectX 11以降ではDirect2DやDirectWriteといった複雑な2D描画や文字列描画に特化した上位レベルの派生APIや、DXGIを経由したDirect3Dとの相互運用・連携機能も整備されている。また、WPFではハードウェアに応じてDirect3Dが使用されるが、Direct2D/DirectWriteのようにAPIが高度に抽象化されており、複雑な2D描画や文字列描画にはDirect3DやOpenGLを直接使用するよりも向いている。

 マルチGPU 
Direct3DではDXGIアダプターを列挙することで、複数のGPUを搭載したシステムにおいて任意のGPUを選択的に使用することが可能となっているDXGI overview - Win32 apps | Microsoft Docs。これにより、Direct3Dのコンピュートシェーダー（DirectCompute）ではCUDAやOpenCLのように複数のGPUを利用して各々にGPGPU演算処理を分散実行させ、アプリケーションソフトウェアの並列処理性能を向上させるといった使い方ができる。一方、OpenGLで複数のGPUを選択的に使用したり、それぞれのGPUに対してレンダリングコンテキストやリソースを作成したりする機能はOpenGL 4.6時点でも標準化されていない。Windows環境においては、2006年にNVIDIAからWGL_NV_gpu_affinityWGL_NV_gpu_affinity | Khronos Registry - The Khronos Group IncHD is now 8MP & HDR - NVISION 08 | Ian Williams - Manager, PSG Applied Engineering、2009年にAMDからWGL_AMD_gpu_associationWGL_AMD_gpu_association | Khronos Registry - The Khronos Group IncというWGL拡張がそれぞれ提供されているが、AMD拡張のほうはRadeonでもFireProでも使用できるOpenGL Hardware Database by Sascha Willems | Reports supporting WGL_AMD_gpu_associationものの、NVIDIA拡張のほうはGeForceでは使用できず、Quadroのみの対応となっているOpenGL Hardware Database by Sascha Willems | Reports supporting WGL_NV_gpu_affinity。Windows以外のプラットフォームではAMDによるX Window System向けのGLX拡張GLX_AMD_gpu_associationGLX_AMD_gpu_association | Khronos Registry - The Khronos Group Incのみで、NVIDIAからは提供されておらず、アプリケーション側からリソースを割り当てるGPUを個別に指定する手段がない。

なお、NVIDIA SLIに対応した複数のGPUを用いてSLI構成を行なうことによりGPUドライバー側で分散処理を実行させることはできるが、SLIは主にOpenGLやDirect3Dにおけるグラフィックスフレームのレンダリングを自動的に分散処理して高速化する技術であり、SLI環境下でのGPGPU分散処理を行なう場合は注意点や制約が存在するProgramming Guide :: CUDA Toolkit Documentation（NVIDIA GPUにおけるGPGPUはすべてCUDA基盤を利用しているため、このSLI環境における制約はCUDA/OpenCL/DirectCompute/OpenGL Compute Shaderを問わない）。同様にAMD CrossFire (CrossFireX) も分散レンダリングのためのマルチGPU技術であり、またDirect3D 9/10/11およびOpenGLアプリケーションでCrossFireを利用するにはフルスクリーンモード（排他モード）で動作している必要があるHow to Configure Discrete Graphics Cards to Run In AMD CrossFire™ Mode (Article Number: DH-018) | AMDHow to Configure Discrete Graphics Cards to Run in AMD CrossFire™ Mode (Article Number: DH2-018) | AMD。さらに、AMDマルチGPU環境でOpenCLを利用したGPGPU分散処理を行なう場合、CrossFire (CrossFireX) をOFFにすることが推奨されているFrequently Asked Questions AMD OpenCL™ Coding Competition : OpenCL Questions : 26. Does the AMD APP SDK v2.4 with OpenCL 1.1 support work on multiple GPUs (ATI CrossFire)?。なお、SLIやCrossFire/CrossFireXではメモリのミラーリングが行なわれるため、複数のGPUを搭載していても、使用できるメモリ総量は各GPUメモリの合計値とはならない。一方、DirectX 12（WDDM 2.0）ではSLIやCrossFireといったベンダー独自技術に依存しない形でマルチGPUにネイティブ対応し、標準で分散レンダリングを可能とするほか、複数GPUのビデオメモリを単一のメモリプールに統合することも可能となっているAMD、Windows 10/DirectX 12への対応は万全とアピール - PC WatchDirectX 12の異種混合GPU「EMA」でGeForceとRadeonをハイブリッドすると意外な結果に - GIGAZINE。

また、Adobe PhotoshopではバージョンCS4以降、OpenGLによるハードウェアアクセラレーションが導入されているGPU と OpenGL の機能と制限（Photoshop CS4/CS5）が、マルチGPU環境は推奨されていないPhotoshop CC GPU FAQ。

 コンピュート機能（GPGPU機能）とウィンドウ／レンダリングコンテキスト 
DirectCompute (Direct3D 11/12) ではCUDAおよびOpenCL同様に、OSのウィンドウシステム（ユーザーインターフェイス）とは直接関連しない完全なオフスクリーンオブジェクトであるDirect3Dデバイスおよびデバイスコンテキストを作成するだけで、コンピュート機能を利用することが可能となっている（コンピュートシェーダーの実行つまりコンピュートカーネルの発行には、DXGIスワップチェーンの作成およびプレゼンテーションは不要）directx-sdk-samples/BasicCompute11.cpp at master · walbourn/directx-sdk-samples。一方、OpenGL APIは必ずレンダリングコンテキストを作成してから使用する必要があり、また描画命令を発行するためにはレンダリングコンテキストをバインドするサーフェイスを、OSのウィンドウシステムに関与するAPIを利用して作成する必要がある（例えばWindowsの場合はウィンドウDCまたはメモリDCといったGDIのデバイスコンテキストが必要）wglCreateContext function (wingdi.h) - Win32 apps | Microsoft DocswglMakeCurrent function (wingdi.h) - Win32 apps | Microsoft Docs。OpenGL 4.3では汎用計算向けのコンピュートシェーダーが搭載されたが、この制約のためにOpenGLでコンピュートシェーダーを利用する場合は必ずOSのウィンドウシステムへのアクセスが必要となってしまう。シミュレーションの可視化など、OpenGLコンピュートシェーダーを必ずグラフィックス連携用途に使うことを前提としている場合は大きな問題にならないが、完全なオフスクリーンで純粋にコンピュート機能を利用しようとする場合には障壁となりうる（OpenGL 4.6時点での代替策、すなわち完全オフスクリーンでのコンピュート実行はOpenCLに頼らざるを得ない）。

 マルチスレッド対応 
Direct3D 11ではイミディエイトコンテキスト／ディファードコンテキストという形で、マルチコアCPUにおいてマルチスレッドを活用して描画パフォーマンスを向上する仕組みが導入されDirect3D 11 のマルチスレッドの概要 | Microsoft Docs、Direct3D 12ではさらにコマンドキューベースのマルチスレッドレンダリング機能による描画効率の向上が図られているが、OpenGLでは4.6時点で相当機能をサポートしていない。また、Direct3D 11ではデバイスインターフェイスのメソッド呼び出しがスレッドセーフであり、サブスレッドからのリソース生成や複数のスレッドからのリソース同時生成に標準で対応している（同時利用可能なスレッド数はドライバーに依存するマルチスレッドによるオブジェクトの作成 | Microsoft Docs）が、OpenGLではレンダリングコンテキストを作成したスレッドのみがリソースを扱えるようになっているため、サブスレッドでリソース生成を行なうにはwglShareLists()関数wglShareLists function (wingdi.h) - Win32 apps | Microsoft DocsOpenGL and multithreading - OpenGL WikiやglXCreateContext()関数glXCreateContext | Khronosといったプラットフォーム依存のAPIを利用して明示的にコンテキスト共有を行なう必要がある。OpenGL 4.6ではGL_KHR_parallel_shader_compileとして複数のシェーダーの並列コンパイルに対応したが、コア機能ではなく拡張扱いであるクロノス・グループ、SPIR-V機能を搭載した「OpenGL® 4.6」を発表 - Press Release - Khronos GroupOpenGL 4.6の進化点やOpenCLの将来について，Khronos Group代表のNeil Trevett氏に聞いてみた - 4Gamer.net。

 ドライバー品質とGLSLコンパイラー 
Direct3D (Windows) にはWHQL (Windows Hardware Quality Lab) WHQL Release Signature - Windows drivers | Microsoft Docsというドライバー品質保証の仕組みが存在するが、OpenGLコミュニティ総体にはそういったドライバー認証システムは存在していなかった 。またDirect3Dとは違ってOpenGLおよびOpenGL ESドライバーはベンダーや個々の製品によって出来不出来の差が激しく、このドライバー品質問題に関して開発者やユーザーから不満の声が上がっていたDolphin Emulator - Dolphin Emulator and OpenGL drivers - Hall of Fame/ShameRich Geldreich's Tech Blog: The Truth on OpenGL Driver Quality。さらに、GLSLのリファレンスコンパイラー実装はKhronosグループによって提供されているReference Compilerものの、OpenGL/OpenGL ESにおいてはシェーダープログラムの共通バイトコード仕様が定義されていないためにGLSLオフラインコンパイラーは存在せず、シェーダープログラムのコンパイルはベンダーごとのドライバーに実装されたGLSLオンラインコンパイラーによって実行時になされる。しかし、OpenGL仕様にはエラーハンドリングなどに関して厳密に規定されていないあいまいな部分が存在することから、現実問題としてベンダーごとにコンパイラーの挙動が異なるという処理系依存動作を許可してしまっているのが実態であり、これがアプリケーション開発者の負担増加につながり、またドライバーやアプリケーションプログラムにおけるバグの温床となってしまう２年間ずっとわからなかったOpenGLのバグ - リンゴをかじれ, Internet Archiveopengl:glsl [HYPERでんち]。

OpenGL 4.4以降においては、Khronosグループによる品質保証制度を新設し、品質問題の改善を進めることとなった「OpenGL 4.4」および「OpenCL 2.0」が発表される | SourceForge.JP Magazine:。また、OpenGLの後継APIとなるVulkanでは、前述のようにシェーダープログラムの中間言語としてSPIR-Vを採用している。OpenGL 4.6ではSPIR-Vのサポートがコア機能として組み込まれた。

Googleによるプロジェクトgoogle/angle: A conformant OpenGL ES implementation for Windows, Mac, Linux, iOS and Android.はもともと、Direct3Dなどの他のグラフィックスAPIをラップしてOpenGL ES APIをエミュレートすることで、ブラウザのWebGLの実装に利用するためのライブラリだったがGoogleが「ANGLE」プロジェクト、Windows向けにWebGL互換レイヤ | マイナビニュース、ネイティブのOpenGLドライバーやOpenGL ESドライバーの品質問題を回避する目的でも使われている（Windows上ではDirect3DがプライマリAPIであり、ドライバー品質もOpenGLより安定している）Qt 5 on Windows ANGLE and OpenGL/ja - Qt Wiki。ANGLEプロジェクトでは他にも、Vulkan APIをラップしてOpenGL ES APIをエミュレートすることで、OpenGLドライバーの品質問題だけでなく、パフォーマンスを改善する取り組みが行なわれており、WindowsだけでなくLinuxやAndroidでも利用できるGoogle Developers Japan: Android Q ベータ版の概要。後述のようにOpenGLやOpenGL ESが非推奨となってしまったmacOS/iOS上で、Metal APIをラップしてOpenGL ES APIをエミュレートする取り組みも進められている。

 DirectXとの関係 

OpenGLは3Dグラフィックスを専門的に扱うライブラリである。対してMicrosoft DirectXは、ゲーム開発での利用を主な用途としており、グラフィックスのみならずサウンドや入力関連のAPIを含んでいる点で性質が異なる。
なお、OpenGLと直接比較されるべきAPIは、DirectX製品の一部、グラフィックスを司るDirect3Dである。

DirectXは主にWindowsやXboxプラットフォームでのゲーム開発等で多く用いられる（Linux上でDirectXを動作させるCedegaなどの例もある）。対してOpenGLはクロスプラットフォームであり、Windowsだけでなく様々なOSに実装が提供されている。Windows環境ではDirectXとOpenGLを両立させることも可能である。

発祥がワークステーションであることやクロスプラットフォームであることから、CADや工業デザイン、科学技術計算や医療での視覚化等の業務分野では、クロスプラットフォームなアプリケーションに限らずWindows専用アプリケーションであっても、Direct3D等のエンタテインメント用途重視のグラフィックスAPIよりもOpenGLが用いられることが多い。そのため、ワークステーションや業務向けのGPUやビデオカード製品には、OpenGLに最適化された仕様のものが販売される傾向がある。OpenGL向けと称されているGPUにはNVIDIA社の『NVIDIA Quadro/NVIDIA RTX』シリーズや、AMD (旧ATI) の『AMD FirePro/AMD Radeon Pro (旧ATI FirePro/ATI FireGL)』シリーズが存在し、デバイスドライバーを含めた仕様がOpenGL用に最適化されている。しかしその反面、これらの製品はDirectX (Direct3D) への最適化が甘く、DirectXを使用したアプリケーションにおける性能が芳しくない傾向もある。なお、業務用アプリケーションソフトウェアの中には、ドライバーの品質や安定性などの観点から、OpenGL/Direct3Dを問わず、これらのプロフェッショナル向けグラフィックスハードウェア製品のみ動作保証しているものもある。例えば、Windows版のAutoCADはかつてOpenGLを使用していたものの、バージョン2008以降はWindows VistaではDirect3Dが使用されるようになりAutoCAD 2008 の動作環境、またバージョン2022以降はDirect3D 12が優先的に使用されるようになっているAutoCAD 製品で旧バージョンの DirectX を使用する方法が、テスト済みの認定ハードウェアにはゲーミング用途のコンシューマー向け製品は含まれておらず、プロフェッショナル向け製品のみであるAutoCAD | 認定グラフィックス ハードウェア | Autodek サポート。

後発のローレベルAPIが台頭してOpenGLの進化が止まり、将来性が見込めなくなったことなどを受けて、業務用やデザイン用途のソフトウェアでもOpenGLのサポートを打ち切るケースも出ている。Windows版のShade3Dは、かつてプレビュー表示においてOpenGL/Direct3D両方に対応していたが、OpenGL対応はバージョン17が最後となり、バージョン18以降はDirect3D対応のみとなったShade3D 公式 | 【重要】Windows版Shade3Dシリーズをご利用のお客様へShade3D 公式 | 動作環境 Ver.18。Vectorworksはバージョン2022以降、OpenGLの代わりにDirectX/Metalを使用するようになったCountdown 2022：新機能紹介 vol.3 – Vectorworks Design BlogVectorworks 2022｜製品別動作環境。

GeForceやRadeonのようなコンシューマー向けGPUのWindows版ドライバーは、OpenGLではなくDirect3Dに最適化されているが、コンシューマー向けGPUとWindows版ドライバーによるOpenGLが、常にDirect3Dよりも遅いわけではない（場合によってはOpenGLのほうが高速になることもある）。

なお、WindowsだけでなくLinuxおよびMac (macOS) に対してもGPUベンダーからOpenGL対応のドライバーが供給されているが、Macに関してはWindowsおよびLinuxと異なり、そもそもベンダーが正式対応しているハードウェアが限られているQuadro K5000 for Mac GPUスペック、特徴、ドライバ、サポート | NVIDIAEVGA | 記事 | EVGA GTX 680 Mac 版グラフィックカードSapphire、Mac Pro向けのRadeon HD 7950ビデオカード ～Mac OS X向けのEFIとWindows向けのUEFIを切り替え可能 - PC WatchASCII.jp：パーツ換装でMac Pro（Mid 2012）を徹底パワーアップ！ (4/6)。

シリコングラフィックスとマイクロソフトはかつてOpenGLとDirect3Dの統合を目標として、Fahrenheitと呼ばれる3DグラフィックスAPIの共同開発を1997年に開始したことがあるが、1999年の末までに計画は事実上頓挫している。また、マイクロソフト社はOpenGL ARBの設立時のメンバーでもあったが、2003年に脱退した。その後、シリコングラフィックスの倒産やOpenGL仕様のKhronosグループへの移管など紆余曲折を経て、2014年にはOpenGL 4.5の発表とともに、マイクロソフトがKhronosグループに参加することが明らかになったKhronos Groupが「OpenGL 4.5」をリリース | SourceForge.JP Magazine。

 OpenCLとの関係 
OpenGL仕様を管理しているKhronosグループによって同様に管理されているオープン仕様のAPIとして、GPGPUを含む異種計算資源混在環境（ヘテロジニアス環境）用の並列コンピューティングAPIであるOpenCLが存在する。OpenCLにはDirect3DおよびOpenGLのグラフィックスリソースを扱うことのできる相互運用機能が存在するが、一方でOpenGLはバージョン4.3でDirectX同様にGPGPU用の演算シェーダーを導入している。ただし、OpenCLは依然としてヘテロジニアス環境に特化した幅広いプラットフォーム対応APIであるが、OpenGLの演算シェーダーはよりグラフィックス用途に特化したGPGPU用のものとなり、競合するというよりはむしろ相補的な役割を担うことになる。

 macOSでの非推奨化 
2018年6月5日、AppleはWWDC 2018でOpenGL/OpenCLの非推奨化を発表し、macOS Mojaveにおいて（サポートはまだ打ち切られないものの）OpenGL/OpenCLは非推奨APIとなった。macOSがネイティブにサポートするOpenGLのバージョンは4.1が最後となっているOpenGL および OpenCL グラフィックスを扱う Mac コンピュータ - Apple サポート。

OpenGLの代替として推奨されているAPIはMetalであるが、MetalはVulkan同様、OpenGLよりもハードウェア層に近いローレベルAPIであり、アプリケーション開発向けというよりミドルウェア開発向けに位置する。

 ARM版Windowsでの利用 
Microsoft Surface Pro Xのように、ARMアーキテクチャベースのWindows環境では、opengl32.dllやglu32.dllのネイティブバイナリは用意されているものの、通例GPUベンダーのOpenGLドライバーが提供されておらず、OpenGL 1.2以降の機能を利用することができない。マイクロソフトはARM版のWindows 10/Windows 11向けに、OpenCL/OpenGL/Vulkanアプリケーションを動作させるための互換機能パック（Compatibility Pack）を提供しているOpenCL™、OpenGL®、および Vulkan® 互換機能パック - Microsoft Apps。これはDirectX 12上に構築されたマッピングレイヤーであり、Mesaからフォークしたライブラリなどが含まれるMicrosoft、ARM環境で「OpenCL」「OpenGL」アプリを動作させる互換機能パックを公開 - 窓の杜Announcing the OpenCL™ and OpenGL® Compatibility Pack for Windows 10 on ARM - DirectX Developer Blog。2024年6月現在、OpenGL 3.3以前のAPI互換機能がサポートされている。

クアルコムのSoCであるSnapdragon X Elite内蔵のAdreno GPUでは、マッピングレイヤーを介したOpenGL 4.6のサポートが予定されているクアルコム、「Snapdragon X Elite」搭載PCでほとんどのWindowsゲームが動くと予告 | Gadget Gate。

 脚注 
 注釈 

 出典 

 関連項目 
 DirectX
 Direct3D
 Mantle (API)
 Metal (API)
 Vulkan (API)
 GLSL
 OpenCL
 OpenAL
 OpenGL ES
 OpenSL ES
 Mesa 3D
 VirtualGL



 外部リンク 

 OpenGL公式サイト
 SGI公式サイト
 Khronos Group
 The Khronos Group Inc.
 Khronos Group クロノスグループ日本語サイト
 OpenGL - The Industry
 OpenVG - The Standard for Vector Graphics Acceleration
 OpenGL Programming Guide - 通称「赤本 (red book)」と呼ばれる解説書
 OpenGL Reference Manual - 通称「青本 (blue book)」と呼ばれるリファレンス
 OpenGL.jp - FAQ
 GLUTによる「手抜き」OpenGL入門

*
Category:GPGPU
Category:3DCG
Category:グラフィックカード
Category:グラフィックライブラリ
Category:API
Category:1992年のソフトウェア