高レベルシェーダー言語 [ 1 ] または高レベルシェーディング言語 [ 2 ] (HLSL )は、シェーダーアセンブリ 言語を拡張するためにMicrosoftが Direct3D 9 API 用に開発した独自のシェーディング言語 であり、Direct3D 10以降の統合シェーダーモデルに必要なシェーディング言語となりました。これは、 NvidiaのCg ( グラフィックス用Cの 略)シェーディング言語と並行して開発されました。2つの言語の初期バージョンは、販売方法が異なるだけで同一であると考えられていました。[ 3 ]
CgとHLSLは同じコア構文を共有しているが、Cg/HLSLがグラフィックス処理ユニット のプログラミングにより適するように、Cの一部の機能が変更され、新しいデータ型が追加された。[ 4 ] [ 5 ]
Cg/HLSL 言語には主に 2 つのブランチが存在します。DirectXまたはOpenGL を 出力する Nvidia Cg コンパイラ (cgc)と、バイトコード形式で DirectX シェーダーを出力する Microsoft HLSL です。[ 6 ] [ 7 ] Nvidia の cgc は2012 年に非推奨となり、追加の開発やサポートは提供されていません。 [ 8 ]
HLSLシェーダーを使用すると、2Dおよび3Dコンピュータグラフィックスの両方で多くの 特殊効果を 実現できます。
Cg/HLSL 言語は当初、頂点シェーダー とピクセルシェーダー (GLSL の「フラグメント」) のみをサポートしていました。頂点シェーダーは、アプリケーションから送信される各頂点に対して実行され、主に頂点をオブジェクト空間からビュー空間に変換し、テクスチャ座標を生成し、頂点の法線、接線、および双接線ベクトルなどの照明係数を計算する役割を担います。頂点のグループ (通常は三角形を形成するために 3 つ) が頂点シェーダーを通過すると、その出力位置が補間されて領域内のピクセルが形成されます。このプロセスはラスタライズ として知られています。 DirectX 10 (シェーダー モデル 4) と Cg 2.0 ではジオメトリ シェーダー が導入されました。[ 9 ] このシェーダーは、プリミティブ (三角形/線/点) のいくつかの頂点を入力として受け取り、このデータを使用して追加のプリミティブを生成/退化 (またはテッセレーション ) したり、プリミティブのタイプを変更したりします。生成されたプリミティブはそれぞれラスタライザーに送信されます。 DirectX 11(シェーダーモデル5)では、コンピュートシェーダー (GPGPU )とテッセレーションシェーダー (ハルとドメイン)が導入されました。後者はCg 3.1に搭載されています。 DirectX 12(シェーダーモデル6.3)では、レイトレーシング シェーダー(レイ生成、交差判定、任意のヒット/最も近いヒット/ミス)が導入されました。 D3D11.3とD3D12ではシェーダーモデル5.1 [ 10 ] が導入され、後に6.0 [ 11 ]が導入されました。
背景 グラフィックスハードウェアの技術進歩に伴い、3Dグラフィックスプログラミングの一部の分野は非常に複雑化しました。このプロセスを簡素化するために、グラフィックスカードには、頂点シェーダーやピクセルシェーダーを使用してレンダリングパイプラインを変更できる機能など、新しい機能が追加されました。
当初、頂点シェーダーとピクセルシェーダーは、グラフィックス処理ユニット(GPU)のアセンブリ言語のみを用いて、非常に低レベルでプログラミングされていました。アセンブリ言語を使用することで、プログラマーはコードを完全に制御でき、柔軟性も高かったものの、使い勝手はかなり悪かったのです。GPUをプログラミングするための、移植性の高い高レベル言語が必要とされ、これらの問題を克服し、シェーダー開発を容易にするためにCgが開発されました。
Cg/HLSLをアセンブリ言語よりも使用する利点には、以下のようなものがあります。
高水準コードは、アセンブリコードよりも学習、プログラミング、読解、保守が容易である。 Cg/HLSLコードは、アセンブリコードとは異なり、幅広いハードウェアとプラットフォームに移植可能です。アセンブリコードは通常、記述対象のハードウェアとプラットフォームに依存します。 Cg/HLSLコンパイラは、コードの最適化や低レベルのタスクを自動的に実行できます。これらのタスクはアセンブリ言語では難しく、エラーが発生しやすいものです。
言語
データ型 Cg/HLSLには6つの基本データ型があります。そのうちいくつかはC言語と同じですが、その他はGPUプログラミングのために特別に追加されました。これらの型は次のとおりです。
float - 32ビット浮動小数点数半分 - 16ビット浮動小数点数int - 32ビット整数fixed - 12ビット固定小数点数bool - ブール変数サンプラー* - テクスチャオブジェクトを表します Cgには、float3やfloat4x4といった基本データ型に基づいたベクトル型や行列型といったデータ型も備わっています。これらのデータ型は、3Dグラフィックスプログラミングにおいて非常によく用いられます。また、Cgには構造体型や配列型といったデータ型 もあり、これらはC言語の対応する型とほぼ同じように機能します。
機能と制御構造 Cgは、if/else、while、forといった基本的な制御構造をC言語と共有しています。また、関数を定義する方法もC言語と似ています。
環境 Cg プログラムは、異なる機能を持つ GPU を表すさまざまなシェーダー プロファイル用に構築されています。 [ 13 ] これらのプロファイルは、とりわけ、各シェーダーにいくつの命令を含めることができるか、利用可能なレジスタの数、シェーダーが使用できるリソースの種類を決定します。プログラムが正しくても、プロファイル上で動作させるには複雑すぎる場合があります。[ 12 ]
プロファイルとシェーダーの種類が増えるにつれて、Microsoft は、ある世代の GPU に見られるプロファイルのセットをグループ化するために「シェーダー モデル」という用語を使用するようになりました。[ 14 ] Cg は、シェーダー モデル 5.0 までの新しいプロファイルの一部と、glsl または hlsl への変換をサポートしています。[ 13 ]
記載されているGPUは、指定された仕様を最初にサポートしたハードウェアです。メーカーは通常、ドライバーを通じてすべての下位シェーダーモデルをサポートしています。ゲームによっては特定のDirectXバージョンを要求する場合がありますが、必ずしもそのバージョンの完全な仕様に準拠したGPUを必要とするわけではありません。開発者は、より上位のDirectX APIバージョンを使用して、Direct3D仕様の低いハードウェアをターゲットにすることができます。たとえば、DirectX 9は、DirectX 7では公開されていなかったDirectX 7レベルのハードウェアの機能を公開し、固定機能のT&Lパイプラインをターゲットにしています。
ピクセルシェーダーの比較 PS 1.0 — 未公開の3dfx Rampage、DirectX 8PS 1.1 — GeForce 3 、DirectX 8PS 1.2 — 3Dlabs Wildcat VP、DirectX 8.1PS 1.3 — GeForce 4 Ti 、DirectX 8.1PS 1.4 — Radeon 8500–9250 、Matrox Parhelia 、DirectX 8.1シェーダーモデル2.0 — Radeon 9500–9800/X300–X600 、DirectX 9シェーダーモデル2.0a — GeForce FX/PCX 最適化モデル、DirectX 9.0aシェーダーモデル2.0b — Radeon X700–X850 シェーダーモデル、DirectX 9.0bシェーダーモデル3.0 — Radeon X1000 およびGeForce 6 、DirectX 9.0cシェーダーモデル4.0 — Radeon HD 2000 およびGeForce 8 、DirectX 10シェーダーモデル4.1 — Radeon HD 3000 およびGeForce 200 、DirectX 10.1シェーダーモデル5.0 — Radeon HD 5000 およびGeForce 400 、DirectX 11シェーダーモデル5.1 — GCN 1+ 、Fermi+、WDDM 2.0対応DirectX 12(11_0+)シェーダーモデル6.0 — GCN 1+、Kepler+、DirectX 12 (11_0+)、WDDM 2.1シェーダーモデル6.1 — GCN 1+、Kepler+、DirectX 12 (11_0+)、WDDM 2.3シェーダーモデル6.2 — GCN 1+、Kepler+、DirectX 12 (11_0+)、WDDM 2.4シェーダーモデル6.3 — GCN 1+、Kepler+、DirectX 12 (11_0+)、WDDM 2.5シェーダーモデル6.4 — GCN 1+、Kepler+、Skylake+、DirectX 12 (11_0+)、WDDM 2.6シェーダーモデル6.5 — GCN 1+、Kepler+、Skylake+、DirectX 12 (11_0+)、WDDM 2.7シェーダーモデル6.6 — GCN 4+、Maxwell+、DirectX 12 (11_0+)、WDDM 3.0シェーダーモデル6.7 — GCN 4+、Maxwell+、DirectX 12 (12_0+)、WDDM 3.1シェーダーモデル 6.8 — RDNA 1+、Maxwell 2+、DirectX 12 (12_0+)、WDDM 3.1 / 3.2、Agility SDK 使用「実行命令数 」の「32 + 64」とは、「テクスチャ命令32個と算術命令64個」を意味します。
標準ライブラリ C言語と同様に、Cg/HLSLにはGPUプログラミングにおける一般的なタスクのための関数群が備わっています。一部の関数は、数学関数absやsinのようにC言語にも同等の関数が存在しますが、テクスチャマッピング 関数tex1Dやtex2Dのように、GPUプログラミングのタスクに特化した関数もあります。
Cg/HLSLランタイムライブラリCg/HLSLプログラムは頂点シェーダーとピクセルシェーダーのみで構成されており、レンダリング処理の残りの部分を処理する補助プログラムが必要です。CgはOpenGL またはDirectX という2つのグラフィックスAPI で使用できます。それぞれに、現在のCgシェーダーの設定、パラメータの受け渡しなど、Cgプログラムと通信するための独自のCg関数セットがあります。(HLSLはDirectXのみを対象としています。)
Cgランタイムは、Cgソースコードをアセンブリコードにコンパイルできるだけでなく、サポートプログラムの実行中にシェーダーをコンパイルする機能も備えています。これにより、ランタイムは、プログラムが現在実行されているハードウェアで利用可能な最新の最適化を使用してシェーダーをコンパイルできます。ただし、この手法では、シェーダーのソースコードがプレーンテキストでコンパイラに提供される必要があり、プログラムのユーザーがシェーダーのソースコードにアクセスできるようにする必要があります。一部の開発者は、これをこの手法の大きな欠点とみなしています。
シェーダーのソースコードを公開せずに、ハードウェア固有の最適化を維持するために、プロファイルという概念が開発されました。シェーダーは、プロファイルに応じて、さまざまなグラフィックスハードウェアプラットフォームに合わせてコンパイルできます。サポートプログラムを実行すると、プロファイルに基づいて最適なシェーダーがロードされます。たとえば、複雑なピクセルシェーダーをサポートするグラフィックスカード用のプロファイルと、最小限のピクセルシェーダーのみをサポートするグラフィックスカード用のプロファイルが存在する場合があります。サポートプログラムは、これらのプロファイルごとにピクセルシェーダーを作成することで、高性能システムでの画質を損なうことなく、サポートするハードウェアプラットフォームの数を増やすことができます。
コンパイラと方言 Cg方言には、これまでNvidiaのCgツールキットという形で、コンパイラが1つしか存在しなかった。
Microsoft は HLSL 用のコンパイラを 2 つリリースしました。最初のコンパイラはクローズド ソースの FXC (Effect Compiler) で、2015 年までサポートされていました。これは、新しい HLSL 機能をサポートするオープンソースのLLVMベースの DXC (DirectXShaderCompiler) に置き換えられました。 [ 24 ] どちらのコンパイラもバイト コードを生成します。古い FXC は DXBC を使用していましたが、DXC は現在 DXIL を使用しています。DXC はSPIR-V バイト コードも出力できます。[ 25 ]
Khronos Group は、GLSL から SPIR_V へのコンパイラである glslang のフロントエンドとして、LLVM ベースの HLSL コンパイラも作成しました。SPIR-V のサポートにより、シェーダーはクロスプラットフォームになり、DirectX スタックに限定されなくなりました。[ 26 ] このタスクは以前はHLSL2GLSL のようなソースレベルのコンバータによって実行されていましたが、結果として得られるコードはしばしば肥大化していました。[ 27 ]
派生言語 PlayStation Shader Language (PSSL) は Cg/HLSL をベースにしています。[ 28 ]
ReshadeFX シェーディング言語も Cg/HLSL をベースにしています。ReshadeFX で記述されたシェーダーは OpenGL、DX、または Vulkan にコンパイルされ、ゲームに挿入されてポストプロセス フィルターとして機能します。[ 29 ]
Khronosはその後glslangを 進化させ、HLSLとほぼソースコード互換性のあるシェーディング言語およびコンパイラであるslangを開発しました。slangは、テキストシェーディング言語(GLSL、 MSL 、CUDA、WGSL )、バイトコード(D3D11、D3D12、Vulkan SPIR-V )、およびCPUにコンパイルできます。また、GLSL互換モードも備えています。[ 30 ]
CgまたはHLSLを使用するアプリケーションおよびゲーム
参考文献 ↑ 「Direct3D 9 での HLSL シェーダーの記述」。Microsoft Docs。2021 年 2 月 22 日 取得 。 ↑ 「高レベルシェーダー言語(HLSL)」 。 Microsoft Docs 。 2021年 2月22日 取得 。 ↑ "Fusion Industries :: Cg および HLSL FAQ ::" 。2012 年 8 月 24 日。2012 年 8 月 24 日の オリジナルからアーカイブされています。 ↑ "Fusion Industries :: Cg および HLSL FAQ ::" 。2012 年 8 月 24 日。2012 年 8 月 24 日の オリジナルからアーカイブされています。 ↑ 「CGチュートリアル - 第1章 はじめに」 . developer.download.nvidia.cn . ↑ 「Direct3D 9 (Windows) での HLSL シェーダーの記述」 。msdn.microsoft.com。2021 年 5 月 24 日。 ↑ 「CG FAQ」 。NVIDIA DesignWorks 。2011年3月8日。 2017年 5月25日 取得 。 ↑ 「Cg Toolkit | NVIDIA Developer」 。2011年3月8日。 ↑ 「Cg 2.0 リリースノート」 (PDF) 。nvidia.com 。 2008 年1月。 ↑ 「シェーダーモデル 5.1 オブジェクト」 。Microsoft Docs 。 2021年 2月22日 取得 。 ↑ "HLSL シェーダー モデル 6.0" . Microsoft Docs . 2021 年 2 月 22 日 取得 . 1 2 マーク・J・キルガード 、『2ページで見るCG』 、2003年。1 2 「Cg プロファイル ドキュメント」 。Nvidia 開発者 。 ↑ 「シェーダーモデルとシェーダープロファイル - Win32 アプリ」 。docs.microsoft.com。2021 年 6 月 30 日。 1 2 3 4 5 6 「ピクセルシェーダーの違い」 。Microsoft Docs 。2020年8月19日。 2021年 2月22日 取得 。 1 2 3 4 5 Peeper, Craig; Mitchell, Jason L. (2003 年 7 月)。 「DirectX 9 高レベル シェーダー言語入門」 。Microsoft Docs。2021 年 2 月 22 日 取得 。 1 2 3 Shimpi, Anand Lal . "NVIDIAがGeForce FX (NV30)を発表" . AnandTech . 2013年6月10日の オリジナルからアーカイブ済み。 2021年 2月22日 取得 。 ↑ Wilson, Derek. "ATI Radeon X800 Pro および XT Platinum Edition: R420 が登場" . AnandTech . 2012 年 9 月 28 日の オリジナルからアーカイブ済み . 2021 年 2 月 22 日 取得 . 1 2 シェーダーモデル 3.0、Ashu Rege、NVIDIA デベロッパーテクノロジーグループ、2004 年。 1 2 Direct3D 10 システム、David Blythe、Microsoft Corporation、2006 年。 1 2 "レジスタ - ps_4_1" . Microsoft Docs . 2019 年 8 月 23 日. 2021 年 2 月 22 日 取得 . 1 2 "レジスタ - ps_5_0" . Microsoft Docs . 2019 年 8 月 23 日. 2021 年 2 月 22 日 取得 . 1 2 3 4 「頂点シェーダーの違い」 。Microsoft Docs 。2020年8月19日。 2021年 2月22日 取得 。 ↑ 「FXCからDXCへの移植 」 。GitHub 。 ↑ "microsoft/DirectXShaderCompiler: このリポジトリには、LLVM/Clang をベースにした DirectX シェーダー コンパイラのソースコードが格納されています" 。マイクロソフト。2020 年 10 月 21 日。 ↑ "glslang: GLSL/ESSL 用の Khronos 参照フロントエンド、HLSL 用の部分的なフロントエンド、および SPIR-V ジェネレータ" 。Khronos Group。2020 年 10 月 21 日。 ↑ マット・ターナー 。YouTubeの 動画。 ↑ Stenson, Richard; Ho, Chris. "PlayStation Shading Language for PS4" . GDC Europe 2013 . ↑ 「ReShade FX シェーディング言語」 。GitHub 。 2022年2月15日。 ↑ "shader-slang/slang" 。スラングシェーディング言語。2025年12月8日。 ↑ 「Maya Cgプラグイン | NVIDIA 」 ↑ 「LightWave - 11.6 機能概要」 。 ↑ 「Unity - マニュアル: シェーダーの記述」 。
さらに読む ランディマ・フェルナンド、マーク・J・キルガード (2003)、『CGチュートリアル:プログラマブルリアルタイムグラフィックスの決定版ガイド』 、アディソン・ウェスリー・プロフェッショナル、ISBN 0-321-19496-9 ランディマ・フェルナンド (2004)、『GPU Gems: リアルタイムグラフィックスのためのプログラミングテクニック、ヒント、コツ』 、アディソン・ウェスリー・プロフェッショナル、ISBN 0-321-22832-4 William R. Mark、R. Steven Glanville、Kurt Akeley 、Mark J. Kilgard 、「Cg: Cライクな言語でグラフィックスハードウェアをプログラミングするためのシステム」 、 SIGGRAPH 2003論文集、doi : 10.1145/1201775.882362
外部リンク cgc-opensrc - NVIDIAのオープンソースコンパイラのミラーサイト、2002年 Siggraph 2005の講義ノートには、いくつかの重要な資料(例えば設計論文)がまとめられています。 Nvidiaがホストする資料: CGに関するよくある質問 CGツールキット Cg言語リファレンスとドキュメント NeHe Cg 頂点シェーダーチュートリアル エミュレータで使用されるCg Shader標準のドキュメント Aras Pranckevičius、クロス プラットフォーム シェーダー、2014 年。 Microsoft Docs のHLSL プログラミングガイドDirectX 9 高レベルシェーディング言語入門(ATI) AMD 開発者セントラル リーマーのHLSL入門とチュートリアル(サンプルコードを含む) 2008年11月19日にWayback Machine に アーカイブされました HLSL入門 DirectX中間言語(DXIL)仕様