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

実際にOpenGL仕様そのものに対して、開発者から不満の声も上がっている[49][50][51]。ここではOpenGLの弱点や問題点、および不足機能に関して記述する。
文字列の描画

OpenGL単体では、Windows GDICore Graphicsのような高レベルの文字列描画用APIが用意されていない [1] [2] [3] ため、あらかじめ文字が描画されたテクスチャを(画像ファイルから読み込むなどして)利用するか、プラットフォーム依存の高レベルAPI(例えばWindowsの場合はwglUseFontOutlines()関数[52]など)と連携する必要がある(クロスプラットフォームのユーティリティライブラリであるGLUTなどを使用すると、文字・文字列を描画することができるが、その機能はごく限られており、あくまでデバッグ用途などの簡易的なサポートにとどまる)。NVIDIA拡張としてはGL_NV_Path_Rendering [4][5][53][54]が存在し、高レベルなプリミティブ描画のGPUアクセラレーションやフォントもサポートするが、標準化はされていない。

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

Direct3DではDXGIアダプターを列挙することで、複数のGPUを搭載したシステムにおいて任意のGPUを選択的に使用することが可能となっている[55]。これにより、(CUDAOpenCLのように)複数のGPUを利用して各々にGPGPU演算処理を分散実行させ、アプリケーションソフトウェアの並列処理性能を向上させるといった使い方ができる。一方、OpenGLで複数のGPUを選択的に使用したり、それぞれのGPUに対してレンダリングコンテキストやリソースを作成したりする機能はOpenGL 4.6時点でも標準化されていない。Windows環境においては、2006年にNVIDIAからWGL_NV_gpu_affinity[56][57]、2009年にAMDからWGL_AMD_gpu_association[58]というWGL拡張がそれぞれ提供されているが、AMD拡張のほうはRadeonでもFireProでも使用できる ⇒[6] ものの、NVIDIA拡張のほうはGeForceでは使用できず、Quadroのみの対応となっている ⇒[7]。Windows以外のプラットフォームではAMDによるX Window System向けのGLX拡張GLX_AMD_gpu_association[59]のみで、NVIDIAからは提供されておらず、アプリケーション側からリソースを割り当てるGPUを個別に指定する手段がない。

なお、NVIDIA SLIに対応した複数のGPUを用いてSLI構成を行なうことによりGPUドライバー側で分散処理を実行させることはできるが、SLIは主にOpenGLやDirect3Dにおけるグラフィックスフレームのレンダリングを自動的に分散処理して高速化する技術であり、SLI環境下でのGPGPU分散処理を行なう場合は注意点や制約が存在する[60](NVIDIA GPUにおけるGPGPUはすべてCUDA基盤を利用しているため、このSLI環境における制約はCUDA/OpenCL/DirectCompute/OpenGL Compute Shaderを問わない)。同様にAMD CrossFire (CrossFireX) も分散レンダリングのためのマルチGPU技術であり、またDirect3D 9/10/11およびOpenGLアプリケーションでCrossFireを利用するにはフルスクリーンモード(排他モード)で動作している必要がある[61][62]。さらに、AMDマルチGPU環境でOpenCLを利用したGPGPU分散処理を行なう場合、CrossFire (CrossFireX) をOFFにすることが推奨されている[63]。なお、SLIやCrossFire/CrossFireXではメモリのミラーリングが行なわれるため、複数のGPUを搭載していても、使用できるメモリ総量は各GPUメモリの合計値とはならない。一方、DirectX 12(WDDM 2.0)ではSLIやCrossFireといったベンダー独自技術に依存しない形でマルチGPUにネイティブ対応し、標準で分散レンダリングを可能とするほか、複数GPUのビデオメモリを単一のメモリプールに統合することも可能となっている[64][65]

また、Adobe PhotoshopではバージョンCS4以降、OpenGLによるハードウェアアクセラレーションが導入されている[66]が、マルチGPU環境は推奨されていない[67]
コンピュート機能(GPGPU機能)とウィンドウ/レンダリングコンテキスト

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

Direct3D 11ではイミディエイトコンテキスト/ディファードコンテキストという形で、マルチコアCPUにおいてマルチスレッドを活用して描画パフォーマンスを向上する仕組みが導入され[71]、Direct3D 12ではさらにコマンドキューベースのマルチスレッドレンダリング機能による描画効率の向上が図られているが、OpenGLでは4.6時点で相当機能をサポートしていない。また、Direct3D 11ではデバイスインターフェイスのメソッド呼び出しがスレッドセーフであり、サブスレッドからのリソース生成や複数のスレッドからのリソース同時生成に標準で対応している(同時利用可能なスレッド数はドライバーに依存する[72])が、OpenGLではレンダリングコンテキストを作成したスレッドのみがリソースを扱えるようになっているため、サブスレッドでリソース生成を行なうにはwglShareLists()関数[73][74]やglXCreateContext()関数[75]といったプラットフォーム依存のAPIを利用して明示的にコンテキスト共有を行なう必要がある。


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

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