シェーディング言語は、シェーダー効果のプログラミングに適したグラフィックスプログラミング言語です。シェーディング言語は通常、 「ベクター」、「マトリックス」、「カラー」、「法線」などの特殊なデータ型で構成されます。
オフラインレンダリング
オフライン レンダリングで使用されるシェーディング言語は自然言語に近い傾向があるため、プログラミングに関する特別な知識は必要ありません。オフライン レンダリングは、リアルタイム レンダリングよりも多くの時間と計算を犠牲にして、最高品質の画像を生成することを目的としています。
RenderMan シェーディング言語
RenderManシェーディング言語[1] (略して RSL または SL) は、RenderMan インターフェース仕様で定義され、プロダクション品質のレンダリングに共通するシェーディング言語です。また、最初に実装されたシェーディング言語の 1 つでもあります。
6 つの主要なシェーダー タイプを定義します。
- 光源シェーダーは、光源上の点からターゲット サーフェス上の点に放射される光の色を計算します。
- サーフェス シェーダーは、入射光とオブジェクトの物理的特性に基づいて、オブジェクトの表面上の点の色と位置をモデル化します。
- ディスプレイスメント シェーダーは、色に関係なくサーフェス ジオメトリを操作します。
- 変形シェーダーは空間全体を変換します。RenderMan 実装のうち、SiTex Graphics の AIR レンダラーのみがこのシェーダー タイプを実装しており、空間に適用される単一の線形変換のみをサポートしています。
- ボリューム シェーダーは、ボリュームを通過する光の色を操作します。これにより、霧などの効果が作成されます。
- イメージャー シェーダーは、最終的なピクセル値への色変換を記述します。これはイメージ フィルターに似ていますが、イメージャー シェーダーは量子化前のデータに対して動作します。このようなデータは、一般的な出力デバイスで表示できるものよりも広いダイナミック レンジと色解像度を備えています。
Houdini VEX シェーディング言語
Houdini VEX (Vector Expressions) シェーディング言語 (多くの場合、「VEX」と略される) は、RenderMan をモデルにしています。ただし、完全な 3D パッケージに統合されているため、シェーダー ライターはシェーダー内の情報にアクセスできます。これは、レンダリング コンテキストでは通常利用できない機能です。RSL と VEX の言語の違いは主に構文上のものであり、いくつかのシェード操作名に関する違いもあります。[2]
ジェラートシェーディング言語
Gelato [3]のシェーディング言語は、Houdini の VEX と同様に、RenderMan をモデルにしています。Gelato シェーディング言語と RSL の違いは主に構文上のもので、Gelato では関数定義の引数を区切るためにコンマではなくセミコロンが使用され、いくつかのシェードオペレーションには異なる名前とパラメータがあります。
オープンシェーディング言語
Open Shading Language (OSL) は、 Sony Pictures ImageworksがAutodesk Arnold Rendererで使用するために開発されました。また、 Blenderの Cycles レンダリング エンジンでも使用されています。OSL のサーフェス シェーダーとボリューム シェーダーは、サーフェスまたはボリュームが重要度サンプリングを可能にする方法で光を散乱させる方法を定義します。そのため、レイ トレーシングとグローバル イルミネーションをサポートする物理ベースのレンダラーに適しています。
リアルタイムレンダリング
リアルタイム レンダリング用のシェーディング言語は、現在では広く普及しています。これらの言語は、変換とシェーディング方程式をハードコードしていた以前のパラダイムよりも、高度なハードウェア抽象化とより柔軟なプログラミング モデルの両方を提供します。より少ないオーバーヘッドで、より高度な制御とより豊富なコンテンツを提供します。
GPU上で直接実行されるように設計されたシェーダーは、ストリーム プログラミングモデルのため、高スループットの一般的な処理に役立つようになり、同様のハードウェア上で実行されるコンピュート シェーダーの開発につながりました( GPGPUも参照)。
歴史的には、いくつかのそのような言語が市場を支配してきました。それらについては以下で説明します。
ARBアセンブリ言語
OpenGL Architecture Review Board は、 2002 年に、プログラム可能なグラフィック プロセッサの標準的な低レベル命令セットとして ARB アセンブリ言語を確立しました。
高レベルのOpenGLシェーディング言語は、多くの場合、ロードと実行のために ARB アセンブリにコンパイルされます。高レベルのシェーディング言語とは異なり、ARB アセンブリは制御フローや分岐をサポートしていません。ただし、GPU 間の移植性が必要な場合は引き続き使用されます。
OpenGLシェーディング言語
GLSLまたはglslangとしても知られるこの標準化された[4]シェーディング言語は、 OpenGLで使用することを目的としています。
この言語は、頂点とフラグメントの処理を単一の命令セットに統合し、条件付きループと分岐を可能にします。GLSL の前にはARB アセンブリ言語がありました。
CGプログラミング言語
Nvidia [5]が開発したCg言語は、簡単で効率的な制作パイプラインの統合を目的として設計されました。APIの独立性を備え、アセット管理を改善するための無料ツールが多数付属しています[1]。Cgの開発は2012年に中止され、現在では非推奨となっています。
DirectX シェーダアセンブリ言語
Direct3D 8 および 9 のシェーダー アセンブリ言語は、シェーダー モデル1.0/1.1、2.0、および 3.0の頂点シェーダーとピクセル シェーダーの主なプログラミング言語です。これは、実行のためにグラフィックス ドライバーに渡される中間シェーダー バイトコードの直接表現です。
シェーダアセンブリ言語は、デバッグ目的で中間バイトコードの表現としての機能は保持していますが、統合シェーダモデル4.0、4.1、5.0、5.1を直接プログラムすることはできません。[6]
DirectX 高レベルシェーダー言語
高レベル シェーディング言語( HLSL) は、 DirectX 9 以降および Xbox ゲーム コンソール用の C スタイルのシェーダー言語です。Nvidia の Cg に関連していますが、DirectX と Xbox でのみサポートされています。HLSL プログラムは、DirectX シェーダー アセンブリ言語に相当するバイトコードにコンパイルされます。
HLSL は、Direct3D 9 でシェーダー アセンブリ言語のオプションの代替として導入されましたが、シェーダー アセンブリ言語が非推奨となった Direct3d 10 以降では必須となりました。
Adobe Pixel Bender と Adobe Graphics Assembly Language
Adobe Systemsは、Adobe Flash 10 APIの一部としてPixel Benderを追加しました。Pixel Benderはピクセルしか処理できず、3D頂点データは処理できませんでした。Flash 11では、Stage3Dと呼ばれるまったく新しい3D APIが導入されました。これは、 Adobe Graphics Assembly Language (AGAL)と呼ばれる独自のシェーディング言語を使用しており、完全な3Dアクセラレーションサポートを提供しています。[7] [8] Pixel BenderのGPUアクセラレーションは、Flash 11.8で削除されました。[9] [10]
AGAL は低レベルだがプラットフォームに依存しないシェーディング言語であり、たとえばARB アセンブリ言語[引用が必要]やGLSLにコンパイルできます。
PlayStationシェーダー言語
ソニーは、 Cg/HLSLに似たシェーディング言語だが、PlayStation 4に特化したPlayStation Shader Language (PSSL)を発表しました。PSSLはDirectX 12のHLSLシェーダー言語とほぼ互換性があると言われていますが、PS4およびPS5プラットフォーム向けの追加機能も備えています。[11]
メタルシェーディング言語
AppleはMetalと呼ばれる低レベルのグラフィックAPIを開発しており、これは2012年以降に製造されたほとんどのMac 、 5S以降のiPhone、iPad Air以降のiPadで動作する。MetalにはMetal Shading Language (MSL)と呼ばれる独自のシェーディング言語があり、C++14に基づいてclangとLLVMを使用して実装されている。MSLは頂点、フラグメント、計算処理を統合している。[12]
WebGPU シェーディング言語
WebGPUシェーディング言語(WGSL)はWebGPUのシェーダ言語です。つまり、WebGPU APIを使用するアプリケーションはWGSLを使用して、GPU上で実行されるシェーダと呼ばれるプログラムを表現します。[13]
翻訳
シェーダをあるシェーディング言語から別のシェーディング言語に移植するには、いくつかのアプローチが用いられる: [14]
- 共通インターフェースを定義します。たとえば、Cg/HLSL、GLSL、MSL はすべてC プリプロセッサマクロを実装しているため、さまざまな操作をすべて共通インターフェースにラップできます。Valve の Source 2 と NVIDIA のFXAA 3.11 はこれを実行します。
- ある言語を別の言語に翻訳します。たとえば、DirectX バイトコードは HLSLcc を介して部分的に GLSL に変換できます。また、ANGLEやHLSL2GLSLなど、GLSL を HLSL に変換するためのツールもいくつか存在します。
- 中間言語を定義する。SPIR -Vは部分的にこの目的のために設計されている。HLSLまたはGLSLから生成でき、HLSL、GLSL、またはMSLに逆コンパイルできる。[15]
参考文献
- ^ スタッフ (1986–2012). 「The RISpec」.ピクサー. 2011年7月25日時点のオリジナルよりアーカイブ。2012年6月9日閲覧。
- ^ スタッフ。「Houdini」 。Side FX。Side Effects Software Inc. 2008年7月22日時点のオリジナルよりアーカイブ。2012年6月9日閲覧。
- ^ NVIDIA Corporation (2003–2008). 「ホーム」. NVIDIA Gelato Zone . NVIDIA Corporation. 2006年4月26日時点のオリジナルよりアーカイブ。 2012年6月9日閲覧。
- ^ スタッフ (1997–2012). 「OpenGL シェーディング言語」. OpenGL . The Khronos Group . 2012 年6 月 9 日閲覧。
- ^ スタッフ (2012). 「Cg Toolkit」. NVIDIA Developer Zone . NVIDIA Corporation . 2012 年6 月 9 日閲覧。
- ^ 「Asm Shader Reference - Win32 アプリ」。learn.microsoft.com。2019年 12 月 10 日。
- ^ Joseph Labrecque (2011). Adobe AIR 3 の新機能. O'Reilly Media, Inc. pp. 17–26. ISBN 978-1-4493-1108-7。
- ^ Remi Arnaud (2011)。「Web ブラウザでの 3D」。Eric Lengyel (編)。Game Engine Gems 2。CRC Press。pp. 207–212。ISBN 978-1-56881-437-7。
- ^ “Stage3D”. scrap.mit.edu . 2014年8月5日閲覧。
- ^ 「Adobe Flash Player 11.8 - バグ 3591185: Pixel Bender シェーダーのパフォーマンスが FP11.8 で大幅に低下。「NeverFix」としてクローズ」。2014 年 4 月 22 日時点のオリジナルよりアーカイブ。
- ^ Stenson, Richard; Ho, Chris. 「PS4 向け PlayStation シェーディング言語」。GDCヨーロッパ 2013。
- ^ メタルシェーディング言語ガイド
- ^ 「WebGPU シェーディング言語」。
- ^ プランケヴィチウス、アラス (2014 年 3 月 28 日)。 「2014 年のクロス プラットフォーム シェーダー · Aras の Web サイト」。
- ^ 「SPIR-V ツールチェーン」。LunarXchange。
注記
- ^ OpenGL の以前の頂点シェーディング言語 (順不同) には、EXT_vertex_shader、NV_vertex_program、前述の ARB_vertex_program、NV_vertex_program2、NV_vertex_program3 などがあります。
- ^ フラグメント シェーディングの場合、nvparse は、ピクセル計算用の NV_register_combiners、NV_register_combiners2、テクスチャ検索用の NV_texture_shader、NV_texture_shader2、NV_texture_shader3 に基づく高レベル抽象化を特徴とする最初のシェーディング言語である可能性があります。ATI_fragment_shader は、「文字列指向」の解析機能さえ提供していませんでした (ただし、後に ATI_text_fragment_shader によって追加されました)。ARB_fragment_program は非常に成功しています。NV_fragment_program と NV_fragment_program2 は実際には似ていますが、後者は他のものに比べてはるかに高度な機能を提供します。
- ^ NVIDIA ホームページの Fx Composer、http://developer.nvidia.com/object/fx_composer_home.html
- Rudy Cortes および Saty Raghavachary: RenderMan シェーディング言語ガイド、Course Technology PTR、第 1 版 (2007 年 12 月 27 日)、ISBN 1-59863-286-8
