DirectX 11 と OpenGL Core
コンピュートシェーダー

OpenGL コア詳細

OpenGL コアは新しいバックエンドで、Windows、MacOS X、Linux 上で最新の OpenGL 機能に対応できます。OpenGL のドライバサポートに応じて、OpenGL コアは OpenGL 3.2 から OpenGL 4.5 に設定されます。

新しい OpenGL コアは、MacOS X と Linux ではデフォルトとして使用されています。

MacOS X OpenGL ドライバ制限

新しい機能として、OS X エディターとスタンドアローンは、現在、新しい OpenGL バックエンドに対応します。そのため、テッセレーションやジオメトリシェーダーなどの OpenGL 3.x and 4.x 機能を使用することができます。

ただし、Apple が OS X デスクトップ上の OpenGL バージョン を最大で 4.1 までと制限したため、すべての DirectX 11 機能 (Unordered Access Views や コンピュートシェーダーなど) に対応しているわけではありません。つまり、シェーダーレベル 5.0 (# pragmatarget 5.0を伴う) をターゲットに設定されているすべてのシェーダーは OS X へ読み込むことができないということです。

そのため、新しいシェーダーターゲットレベル、#pragma target gl4.1 が導入されました。このターゲットレベルはデスクトップで最低 OpenGL 4.1 か DirectX 11.0 シェーダーレベル 5、または、モバイルで OpenGL ES 3.1 + Android Extension Pack を必要とします。

OpenGL コア機能

新しい OpenGL バックエンドは多くの新しい機能 (以前は、その機能のほとんどは DX11/GLES3 だけに可能) を備えています。

  • コンピューターシェーダー (ComputeBuffers と “Random Write” レンダーテクスチャ同様)
  • テッセレーション と ジオメトリシェーダー
  • Indirect draw (Graphics.DrawProcedural と Graphics.DrawProceduralIndirect)
  • アドバンスドブレンドモード

シェーダー変更

既存の #pragma ターゲットを使用する場合、以下の GL レベルにマップされます。

  • #pragma target 4.0 // OpenGL ES 3.1、デスクトップ OpenGL 3.x、DX シェーダーモデル 4.0
  • #pragma target gl4.1 // デスクトップ OpenGL 4.1、SM 4.0 + テッセレーションして MacOSX 10.9 性能に合わせる
  • #pragma target 5.0 // OpenGL ES 3.1 + Android Extension Pack、デスクトップ OpenGL >= 4.2、DX シェーダーモデル 5.0

シェーダープラットフォームがある特定のシェーダーを使用できるようにしたり、できなくしたりするために、以下の #pragma only_renderers / exclude_renderers ターゲットを使用します。

  • #pragma only_renderers glcore: デスクトップ GL のコンパイルだけを行います。ES 3 ターゲットのように、これもすべてのデスクトップ GL バージョンを含むように設定されています。基本シェーダーは GL 2.x に対応しますが、SM5.0 機能を要するシェーダーには OpenGL 4.2+ が必要です。

OpenGL コアプロファイル コマンドライン引数

コマンドライン引数を使用して、OpenGL によるエディターやプレイヤーを始動することが可能です。

  • -force-opengl: 旧 OpenGL バックエンドを使用します。
  • -force-glcore: 新しい OpenGL バックエンドを使用します。この引数を使うと、Unity はそのプラットフォームに最適な OpenGL バージョンと可能な OpenGL 拡張すべてを使用して対応できる全機能を検知します。
  • -force-glcoreXY: XY は 32、33、40、41、42、43、44、45。各数字は OpenGL の特定のバージョンを示します。プラットフォームが特定の Open GL バージョンに対応しない場合、Unity は対応できるバージョンに戻します。
  • -force-clamped: Unity が OpenGL 拡張を使用しないよう要求し、複数のプラットフォームが同じコードパスを確実に実行できるようにします。これは、ある問題がプラットフォーム特有のもの (ドライバのバグなど) かをテストする方法の 1つです。

ネイティブのデスクトップ OpenGL ES コマンドライン引数

OpenGL ES グラフィックス API は、OpenGL ES 対応のドライバ付きの、Intel か NVIDIA GPU 搭載 Windows マシンで可能です。

  • -force-gles: 新しい OpenGL バックエンドを OpenGL ES モードで使用します。この引数を使用すると、Unity はそのプラットフォームに最適な OpenGL ES バージョンと可能な OpenGL ES 拡張すべてを使用して対応できる全機能を検知します。
  • -force-glesXY: XY は 20、30、31、31。各数字は OpenGL ES の特定のバージョンを示します。プラットフォームが特定の OpenGL ES バージョンに対応しない場合、Unity は他のグラフィックス API に戻します。
  • -force-clamped: 複数のプラットフォームで確実に OpenGL を使用しないためにつけるオプションです。これは、プラットフォーム特有の問題(例えばドライバのバグ)をテストするときに便利です。
DirectX 11 と OpenGL Core
コンピュートシェーダー