高レベルシェーダー言語[ 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コンピュータグラフィックスの両方で多くの特殊効果を実現できます。
D3D11.3とD3D12ではシェーダーモデル5.1 [ 10 ]が導入され、後に6.0 [ 11 ]が導入されました。
グラフィックスハードウェアの技術進歩に伴い、3Dグラフィックスプログラミングの一部の分野は非常に複雑化しました。このプロセスを簡素化するために、グラフィックスカードには、頂点シェーダーやピクセルシェーダーを使用してレンダリングパイプラインを変更できる機能など、新しい機能が追加されました。
当初、頂点シェーダーとピクセルシェーダーは、グラフィックス処理ユニット(GPU)のアセンブリ言語のみを用いて、非常に低レベルでプログラミングされていました。アセンブリ言語を使用することで、プログラマーはコードを完全に制御でき、柔軟性も高かったものの、使い勝手はかなり悪かったのです。GPUをプログラミングするための、移植性の高い高レベル言語が必要とされ、これらの問題を克服し、シェーダー開発を容易にするためにCgが開発されました。
Cg/HLSLをアセンブリ言語よりも使用する利点には、以下のようなものがあります。
Cg/HLSLには6つの基本データ型があります。そのうちいくつかはC言語と同じですが、その他はGPUプログラミングのために特別に追加されました。これらの型は次のとおりです。
Cgには、float3やfloat4x4といった基本データ型に基づいたベクトル型や行列型といったデータ型も備わっています。これらのデータ型は、3Dグラフィックスプログラミングにおいて非常によく用いられます。また、Cgには構造体型や配列型といったデータ型もあり、これらはC言語の対応する型とほぼ同じように機能します。
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パイプラインをターゲットにしています。
「実行命令数」 における「32 + 64」とは、「32個のテクスチャ命令と64個の算術命令」を意味します。
C言語と同様に、Cg/HLSLにはGPUプログラミングにおける一般的なタスクのための関数群が備わっています。一部の関数は、数学関数absやsinのようにC言語にも同等の関数が存在しますが、テクスチャマッピング関数tex1Dやtex2Dのように、GPUプログラミングのタスクに特化した関数もあります。
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 ]