OpenGL
[Wikipedia|▼Menu]
□記事を途中から表示しています
[最初から表示]

また、Intel GMAIntel 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の対応バージョンに違いがあったり[3]と、DirectXと比べて同等世代のOpenGLへの対応が遅い環境も存在する。
歴史

元々はSGIが自社ワークステーションで使用していたIRIS GL(英語版)というライブラリを改良し、移植性を高めたものである[4]

1992年以降は、OpenGL Architecture Review Board (ARB) により監修される事となる。このARBには、3DlabsAppleAMD(旧ATI)、デルエバンス・アンド・サザランド(E&S)、HP、IBM、インテルMatroxNVIDIA、シリコングラフィックス、サン・マイクロシステムズ(現オラクル)が参加している。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が追従した機能もいくつか存在する[5]。ASTC(英語版)やETC/EAC(英語版)のようにOpenGL/OpenGL ESでしかサポートされていないものもある[6][注釈 2]
特徴

この節は更新が必要とされています。
この節には古い情報が掲載されています。編集の際に新しい情報を記事に反映
させてください。反映後、このタグは除去してください。(2015年5月)
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のコアプロファイルでは廃止予定の非推奨機能となった[9]
コード例

C/C++向けのOpenGLコード例を示す。

OpenGL 2.xまでの固定機能で三角形を描画する例。
// Direct3D デバイス/デバイスコンテキストとは異なり、// 描画ターゲットとなる OpenGL レンダリングコンテキストは暗黙のグローバルステートとなっており、// 関数引数に対して明示的に指定しない。// コンテキストはスレッドローカル変数として管理される。// https://www.khronos.org/opengl/wiki/OpenGL_ContextglDisable(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 [10]が存在するが、Direct3Dのように頂点バッファと頂点属性を完全に分離して扱えるものではない。頂点宣言・頂点レイアウトの互換機能 GL_ARB_vertex_attrib_binding [11]が標準化されているのはOpenGL 4.3/ES 3.0以降である[12]
プログラマブルシェーダー

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

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

GLU
(英語版) - カメラや球、円筒、曲面などの取り扱いを補助する

GLX - X Window SystemでOpenGLを利用するためのライブラリ

WGL(英語版) - Microsoft WindowsでOpenGLを利用するためのライブラリ (Windows APIおよびGDIの一部)


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:74 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef