高水準シェーダ言語

コンテンツへジャンプ
フリー百科事典『ウィキペディア』より
(シェーダーモデル 3.0からリダイレクト)

Cg/HLSL
複数の異なる2D HLSLシェーダーを含むシーン。彫像の歪みは純粋に物理的な方法で実現され、その横にある長方形のフレームのテクスチャは色の強度に基づいています。背景の正方形は変形および回転されています。前景の水の部分的な透明化反射は、最終的にシーン全体に適用されたシェーダーによって追加されています。
家族シェーディング言語
開発者nVIDIA、マイクロソフト
方言
Cg、HLSL、プレイステーションシェーディング言語、ReShadeFX、スラング
影響を受けた
CRenderMan シェーディング言語
影響を受けた
GLSL

高水準シェーダ言語[ 1 ]または高水準シェーディング言語[ 2 ]HLSL)は、MicrosoftDirect3D 9 API向けに開発した独自のシェーディング言語であり、シェーダアセンブリ言語を拡張する目的でDirect3D 10以降の統合シェーダモデルで必須のシェーディング言語となった。NvidiaのCg ( C for Graphicsの略)シェーディング言語と並行して開発された。初期の両言語は、マーケティングの違いのみで同一と考えられていた。[ 3 ]

CgとHLSLは同じコア構文を共有していますが、Cの一部の機能が変更され、新しいデータ型が追加され、Cg/HLSLはグラフィックス処理ユニットのプログラミングに適したものになりました。[ 4 ] [ 5 ]

Cg/HLSL言語には、DirectXまたはOpenGLを出力するNvidia Cgコンパイラ(cgc)と、バイトコード形式でDirectXシェーダを出力するMicrosoft HLSLの2つの主要なブランチがあります。[ 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ビット浮動小数点数
  • half - 16ビット浮動小数点数
  • int - 32ビット整数
  • fixed - 12ビットの固定小数点数
  • bool - ブール変数
  • サンプラー* - テクスチャオブジェクトを表す

Cgには、float3やfloat4x4といった基本データ型に基づいたベクトル型と行列型も用意されています。これらのデータ型は、3Dグラフィックスプログラミングでは非常によく使用されます。Cgには構造体と配列型もあり、これらはC言語の対応するデータ型と同様に動作します。

オペレーター

[編集]

Cg は、C の一般的な算術演算子、ベクトルおよび行列データ型の同等の算術演算子、一般的な論理演算子など、幅広い演算子をサポートしています

関数と制御構造

[編集]

Cgは、if/else、while、forといった基本的な制御構造をC言語と共有しています。また、関数の定義方法もC言語と似ています。

セマンティクス

[編集]

プリプロセッサ

[編集]

Cgは多くのCプリプロセッサディレクティブとそのマクロ展開システムを実装しています。実装しているのは[ 12 ]#includeです。

HLSL機能

[編集]
  • 名前空間
  • 注釈

環境

[編集]

CGプログラムは、異なる機能を持つGPUに対応する異なるシェーダープロファイル用に構築されています。 [ 13 ]これらのプロファイルは、各シェーダーにいくつの命令を配置できるか、いくつのレジスタが利用できるか、シェーダーがどのようなリソースを利用できるかなどを決定します。たとえプログラムが正しくても、プロファイル上で動作させるには複雑すぎる場合があります。[ 12 ]

プロファイルとシェーダーの種類が増えるにつれて、マイクロソフトは「シェーダーモデル」という用語を使用して、GPUの世代で見られるプロファイルのセットをグループ化するようになりました。[ 14 ] Cgはシェーダーモデル5.0までの新しいプロファイルの一部と、glslまたはhlslへの変換をサポートしています。[ 13 ]

記載されているGPUは、当該仕様を最初にサポートしたハードウェアです。メーカーは通常、ドライバを通じて下位のシェーダーモデルをすべてサポートしています。ゲームによっては特定のDirectXバージョンを必要とすると謳っている場合もありますが、必ずしもそのバージョンの仕様に完全に準拠したGPUを必要とするわけではありません。開発者は、上位のDirectX APIバージョンを使用して、下位のDirect3D仕様のハードウェアをターゲットにすることができるためです。例えば、DirectX 9は、DirectX7では提供されていなかったDirectX7レベルのハードウェアの機能を公開しており、固定機能のT&Lパイプラインをターゲットにしています。

ピクセルシェーダーの比較

[編集]
ピクセルシェーダーバージョン1.01.11.2

1.3 [ 15 ]

1.4 [ 15 ]2.0 [ 15 ] [ 16 ]2.0a [ 15 ] [ 16 ] [ 17 ]2.0b [ 15 ] [ 16 ] [ 18 ]3.0 [ 15 ] [ 19 ]4.0 [ 20 ] 4.1 [ 21 ]

5.0 [ 22 ]

依存テクスチャ制限44468無制限8無制限無制限
テクスチャ命令の制限4446 * 232無制限無制限無制限無制限
演算命令の制限8888 * 264無制限無制限無制限無制限
ポジションレジスタいいえいいえいいえいいえいいえいいえいいえはいはい
命令スロット88 + 48 + 4(8 + 6)* 264 + 32512512≥ 512≥ 65536
実行された命令88 + 48 + 4(8 + 6)* 264 + 3251251265536無制限
テクスチャの間接指定44444無制限4無制限無制限
補間レジスタ2 + 42 + 42 + 42 + 62 + 82 + 82 + 81032
命令述語いいえいいえいいえいいえいいえはいいいえはいいいえ
インデックス入力レジスタいいえいいえいいえいいえいいえいいえいいえはいはい
温度レジスタ22 + 43 + 4612から322232324096
定数レジスタ888832323222416×4096
任意のスウィズリングいいえいいえいいえいいえいいえはいいいえはいはい
グラデーションの指示いいえいいえいいえいいえいいえはいいいえはいはい
ループカウントレジスタいいえいいえいいえいいえいいえいいえいいえはいはい
顔認識(両面照明)いいえいいえいいえいいえいいえいいえはいはいはい
動的フロー制御いいえいいえいいえいいえいいえいいえいいえはい (24)はい (64)
ビット演算子いいえいいえいいえいいえいいえいいえいいえいいえはい
ネイティブ整数いいえいいえいいえいいえいいえいいえいいえいいえはい
  • PS 1.0 — 未リリース3dfx Rampage、DirectX 8
  • PS 1.1GeForce 3、DirectX 8
  • PS 1.23Dlabs Wildcat VP、DirectX 8.1
  • PS 1.3GeForce 4 Ti、DirectX 8.1
  • PS 1.4Radeon 8500~9250Matrox Parhelia、DirectX 8.1
  • シェーダーモデル 2.0Radeon 9500~9800/X300~X600、DirectX 9
  • シェーダーモデル 2.0aGeForce FX/PCX最適化モデル、DirectX 9.0a
  • シェーダーモデル 2.0bRadeon X700~X850シェーダーモデル、DirectX 9.0b
  • シェーダーモデル 3.0Radeon X1000およびGeForce 6、DirectX 9.0c
  • シェーダーモデル 4.0Radeon HD 2000およびGeForce 8、DirectX 10
  • シェーダーモデル 4.1Radeon HD 3000およびGeForce 200、DirectX 10.1
  • シェーダーモデル 5.0Radeon HD 5000およびGeForce 400、DirectX 11
  • シェーダーモデル 5.1GCN 1+、Fermi+、DirectX 12 (11_0+)、WDDM 2.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 個の算術命令」を意味します。

頂点シェーダーの比較

[編集]
頂点シェーダバージョン1.01.1 [ 23 ]2.0 [ 16 ] [ 23 ] [ 17 ]2.0a [ 16 ] [ 23 ] [ 17 ]3.0 [ 19 ] [ 23 ]4.0 [ 20 ]
4.1 [ 21 ]
5.0 [ 22 ]
命令スロット数128128256256≥ 512≥ 65536
実行される命令の最大数12812810246553665536無制限
命令述語いいえいいえいいえはいはいはい
温度レジスタ12121216324096
# 定数レジスタ≥ 96≥ 96≥ 256256≥ 25616×4096
アドレスレジスタいいえはいはいはいはいはい
静的フロー制御いいえいいえはいはいはいはい
動的フロー制御いいえいいえいいえはいはいはい
動的フロー制御の深さ該当なし該当なし該当なし242464
頂点テクスチャフェッチいいえいいえいいえいいえはいはい
テクスチャサンプラーの数該当なし該当なし該当なし該当なし4128
ジオメトリインスタンス化のサポートいいえいいえいいえいいえはいはい
ビット演算子いいえいいえいいえいいえいいえはい
ネイティブ整数いいえいいえいいえいいえいいえはい

標準ライブラリ

[編集]

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年までサポートされていました。しかし、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をslangへと進化させました。これは、HLSLとほぼソースコード互換性のあるシェーディング言語およびコンパイラです。slangは、テキストシェーディング言語(GLSL、MSL、CUDA、WGSL)、バイトコード(D3D11、D3D12、Vulkan SPIR-V)、そしてCPUにコンパイルできます。また、GLSL互換モードも備えています。[ 30 ]

Cg または HLSL を使用するアプリケーションとゲーム

[編集]

参照

[編集]

参考文献

[編集]
  1. ^ 「Direct3D 9 での HLSL シェーダーの作成」 . Microsoft Docs . 2021年2月22日閲覧。
  2. ^ 「高レベルシェーダー言語(HLSL)」 . Microsoft Docs . 2021年2月22日閲覧
  3. ^ “Fusion Industries :: Cg and HLSL FAQ ::” . 2012年8月24日.オリジナルの2012年8月24日時点のアーカイブ
  4. ^ “Fusion Industries :: Cg and HLSL FAQ ::” . 2012年8月24日.オリジナルの2012年8月24日時点のアーカイブ
  5. ^ 「CGチュートリアル - 第1章 はじめに」 . developer.download.nvidia.cn .
  6. ^ 「Direct3D 9 での HLSL シェーダーの記述 (Windows)」 . msdn.microsoft.com . 2021年5月24日.
  7. ^ 「Cg FAQ」 . NVIDIA DesignWorks . 2011年3月8日. 2017年5月25日閲覧
  8. ^ 「Cg Toolkit | NVIDIA Developer」 2011年3月8日。
  9. ^ 「Cg 2.0 リリースノート」(PDF) . nvidia.com . 2008年1月.
  10. ^ 「シェーダーモデル5.1オブジェクト」 . Microsoft Docs . 2021年2月22日閲覧
  11. ^ 「HLSL シェーダーモデル 6.0」。Microsoft Docs 。 2021年2月22日閲覧
  12. ^ a b Mark J. Kilgard『Cg in Two Pages』、2003年。
  13. ^ a b 「Cgプロファイルドキュメント」。Nvidia開発者
  14. ^ 「シェーダーモデルとシェーダープロファイル - Win32 アプリ」 . docs.microsoft.com . 2021年6月30日.
  15. ^ a b c d e f 「ピクセルシェーダーの違い」。Microsoft Docs。2020年8月19日。 2021年2月22日閲覧
  16. ^ a b c d e Peeper, Craig; Mitchell, Jason L. (2003年7月). 「DirectX 9 高レベルシェーダー言語入門」 . Microsoft Docs . 2021年2月22日閲覧
  17. ^ a b c Shimpi, Anand Lal . 「NVIDIAがGeForce FX (NV30)を発表」 . AnandTech . 2013年6月10日時点のオリジナルよりアーカイブ。 2021年2月22日閲覧
  18. ^ Wilson, Derek. 「ATI Radeon X800 Pro and XT Platinum Edition: R420 Arrives」 . AnandTech . 2012年9月28日時点のオリジナルよりアーカイブ。 2021年2月22日閲覧
  19. ^ a b Shader Model 3.0、Ashu Rege、NVIDIA Developer Technology Group、2004年。
  20. ^ a b Direct3D 10 システム、David Blythe、Microsoft Corporation、2006 年。
  21. ^ a b “レジスタ - ps_4_1” . Microsoft Docs . 2019年8月23日. 2021年2月22日閲覧
  22. ^ a b “レジスタ - ps_5_0” . Microsoft Docs . 2019年8月23日. 2021年2月22日閲覧
  23. ^ a b c d 「頂点シェーダーの違い」。Microsoft Docs。2020年8月19日。 2021年2月22日閲覧
  24. ^ 「FXC から DXC への移植。GitHub
  25. ^ 「microsoft/DirectXShaderCompiler: このリポジトリは、LLVM/Clang をベースにした DirectX Shader Compiler のソースをホストしています」。Microsoft。2020年10月21日。
  26. ^ 「glslang: GLSL/ESSL用Khronosリファレンスフロントエンド、HLSL用部分的フロントエンド、およびSPIR-Vジェネレーター」。Khronosグループ。2020年10月21日。
  27. ^ マット・ターナー。YouTube動画
  28. ^ Stenson, Richard; Ho, Chris. 「PS4向けPlayStationシェーディング言語」 GDCヨーロッパ2013 .
  29. ^ 「ReShade FXシェーディング言語」 . GitHub . 2022年2月15日.
  30. ^ "shader-slang/slang" . Slangシェーディング言語. 2025年12月8日.
  31. ^ 「Maya Cg プラグイン | NVIDIA」
  32. ^ 「LightWave - 11.6 機能の概要」
  33. ^ 「Unity - マニュアル: シェーダーの作成」

さらに読む

[編集]
[編集]

    Cg/HLSL
    複数の異なる2D HLSLシェーダーを含むシーン。彫像の歪みは純粋に物理的な方法で実現され、その横にある長方形のフレームのテクスチャは色の強度に基づいています。背景の正方形は変形および回転されています。前景の水の部分的な透明化反射は、最終的にシーン全体に適用されたシェーダーによって追加されています。
    家族シェーディング言語
    開発者nVIDIA、マイクロソフト
    方言
    Cg、HLSL、プレイステーションシェーディング言語、ReShadeFX、スラング
    影響を受けた
    CRenderMan シェーディング言語
    影響を受けた
    GLSL

    高水準シェーダ言語[1]または高水準シェーディング言語[2] ( HLSL ) は、MicrosoftDirect3D 9 API向けに開発した独自のシェーディング言語であり、シェーダアセンブリ言語を拡張する目的で開発されました。その後、Direct3D 10以降の統合シェーダモデルでは必須のシェーディング言語となりました。NvidiaのCg ( C for Graphicsの略) シェーディング言語と並行して開発されました。初期の両言語は、マーケティングの違いのみで同一と考えられていました。[3]

    CgとHLSLは同じコア構文を共有していますが、Cのいくつかの機能が変更され、新しいデータ型が追加され、Cg/HLSLはグラフィックス処理ユニットのプログラミングにより適したものになりました。[4] [5]

    Cg/HLSL言語には、DirectXまたはOpenGLを出力するNvidia Cgコンパイラ(cgc)と、バイトコード形式でDirectXシェーダを出力するMicrosoft HLSLの2つの主要なブランチがあります。[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ビット浮動小数点数
    • half - 16ビット浮動小数点数
    • int - 32ビット整数
    • fixed - 12ビットの固定小数点数
    • bool - ブール変数
    • サンプラー* - テクスチャオブジェクトを表す

    Cgには、float3やfloat4x4といった基本データ型に基づいたベクトル型と行列型も用意されています。これらのデータ型は、3Dグラフィックスプログラミングでは非常によく使用されます。Cgには構造体と配列型もあり、これらはC言語の対応するデータ型と同様に動作します。

    オペレーター

    Cg は、C の一般的な算術演算子、ベクトルおよび行列データ型の同等の算術演算子、一般的な論理演算子など、幅広い演算子をサポートしています

    関数と制御構造

    Cgは、if/else、while、forといった基本的な制御構造をC言語と共有しています。また、関数の定義方法もC言語と似ています。

    セマンティクス

    プリプロセッサ

    Cgは多くのCプリプロセッサディレクティブとそのマクロ展開システムを実装しています。また、を実装しています#include[12]

    HLSL機能

    • 名前空間
    • 注釈

    環境

    Cgプログラムは、異なる機能を持つGPUに対応する異なるシェーダープロファイル用に構築されています。 [13]これらのプロファイルは、各シェーダーにいくつの命令を配置できるか、いくつのレジスタが利用できるか、シェーダーがどのようなリソースを利用できるかなどを決定します。たとえプログラムが正しくても、プロファイル上で動作させるには複雑すぎる場合があります。[12]

    プロファイルとシェーダーの種類が増えるにつれ、マイクロソフトは「シェーダーモデル」という用語を使用して、GPUの世代で見られるプロファイルのセットをグループ化するようになりました。[14] Cgは、シェーダーモデル5.0までの新しいプロファイルの一部と、glslまたはhlslへの変換をサポートしています。[13]

    記載されているGPUは、当該仕様を最初にサポートしたハードウェアです。メーカーは通常、ドライバを通じて下位のシェーダーモデルをすべてサポートしています。ゲームによっては特定のDirectXバージョンを必要とすると謳っている場合もありますが、必ずしもそのバージョンの仕様に完全に準拠したGPUを必要とするわけではありません。開発者は、上位のDirectX APIバージョンを使用して、下位のDirect3D仕様のハードウェアをターゲットにすることができるためです。例えば、DirectX 9は、DirectX7では提供されていなかったDirectX7レベルのハードウェアの機能を公開しており、固定機能のT&Lパイプラインをターゲットにしています。

    ピクセルシェーダーの比較

    ピクセルシェーダーバージョン1.01.11.2

    1.3 [15]

    1.4 [15]2.0 [15] [16]2.0a [15] [16] [17]2.0b [15] [16] [18]3.0 [15] [19]4.0 [20] 4.1 [21]

    5.0 [22]

    依存テクスチャ制限44468無制限8無制限無制限
    テクスチャ命令の制限4446 * 232無制限無制限無制限無制限
    演算命令の制限8888 * 264無制限無制限無制限無制限
    ポジションレジスタいいえいいえいいえいいえいいえいいえいいえはいはい
    命令スロット88 + 48 + 4(8 + 6)* 264 + 32512512≥ 512≥ 65536
    実行された命令88 + 48 + 4(8 + 6)* 264 + 3251251265536無制限
    テクスチャの間接指定44444無制限4無制限無制限
    補間レジスタ2 + 42 + 42 + 42 + 62 + 82 + 82 + 81032
    命令述語いいえいいえいいえいいえいいえはいいいえはいいいえ
    インデックス入力レジスタいいえいいえいいえいいえいいえいいえいいえはいはい
    温度レジスタ22 + 43 + 4612から322232324096
    定数レジスタ888832323222416×4096
    任意のスウィズリングいいえいいえいいえいいえいいえはいいいえはいはい
    グラデーションの指示いいえいいえいいえいいえいいえはいいいえはいはい
    ループカウントレジスタいいえいいえいいえいいえいいえいいえいいえはいはい
    顔認識(両面照明)いいえいいえいいえいいえいいえいいえはいはいはい
    動的フロー制御いいえいいえいいえいいえいいえいいえいいえはい (24)はい (64)
    ビット演算子いいえいいえいいえいいえいいえいいえいいえいいえはい
    ネイティブ整数いいえいいえいいえいいえいいえいいえいいえいいえはい
    • PS 1.0 — 未リリース3dfx Rampage、DirectX 8
    • PS 1.1GeForce 3、DirectX 8
    • PS 1.23Dlabs Wildcat VP、DirectX 8.1
    • PS 1.3GeForce 4 Ti、DirectX 8.1
    • PS 1.4Radeon 8500~9250Matrox Parhelia、DirectX 8.1
    • シェーダーモデル 2.0Radeon 9500~9800/X300~X600、DirectX 9
    • シェーダーモデル 2.0aGeForce FX/PCX最適化モデル、DirectX 9.0a
    • シェーダーモデル 2.0bRadeon X700~X850シェーダーモデル、DirectX 9.0b
    • シェーダーモデル 3.0Radeon X1000およびGeForce 6、DirectX 9.0c
    • シェーダーモデル 4.0Radeon HD 2000およびGeForce 8、DirectX 10
    • シェーダーモデル 4.1Radeon HD 3000およびGeForce 200、DirectX 10.1
    • シェーダーモデル 5.0Radeon HD 5000およびGeForce 400、DirectX 11
    • シェーダーモデル 5.1GCN 1+、Fermi+、DirectX 12 (11_0+)、WDDM 2.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 個の算術命令」を意味します。

    頂点シェーダーの比較

    頂点シェーダバージョン1.01.1 [23]2.0 [16] [23] [17]2.0a [16] [23] [17]3.0 [19] [23]4.0 [20]
    4.1 [21]
    5.0 [22]
    命令スロット数128128256256≥ 512≥ 65536
    実行される命令の最大数12812810246553665536無制限
    命令述語いいえいいえいいえはいはいはい
    温度レジスタ12121216324096
    # 定数レジスタ≥ 96≥ 96≥ 256256≥ 25616×4096
    アドレスレジスタいいえはいはいはいはいはい
    静的フロー制御いいえいいえはいはいはいはい
    動的フロー制御いいえいいえいいえはいはいはい
    動的フロー制御の深さ該当なし該当なし該当なし242464
    頂点テクスチャフェッチいいえいいえいいえいいえはいはい
    テクスチャサンプラーの数該当なし該当なし該当なし該当なし4128
    ジオメトリインスタンス化のサポートいいえいいえいいえいいえはいはい
    ビット演算子いいえいいえいいえいいえいいえはい
    ネイティブ整数いいえいいえいいえいいえいいえはい

    標準ライブラリ

    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)に置き換えられたため、FXCは廃止されました。 [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をslangへと進化させました。これは、HLSLとほぼソースコード互換性のあるシェーディング言語およびコンパイラです。slangは、テキストシェーディング言語(GLSL、MSL、CUDA、WGSL)、バイトコード(D3D11、D3D12、Vulkan SPIR-V)、そしてCPUへのコンパイルが可能です。GLSL互換モードも備えています。[30]

    Cg または HLSL を使用するアプリケーションとゲーム

    参照

    参考文献

    1. ^ 「Direct3D 9 での HLSL シェーダーの作成」Microsoft Docs . 2021年2月22日閲覧
    2. ^ 「高水準シェーダー言語(HLSL)」。Microsoft Docs . 2021年2月22日閲覧
    3. ^ “Fusion Industries :: Cg and HLSL FAQ ::”. 2012年8月24日. オリジナルより2012年8月24日時点のアーカイブ。
    4. ^ “Fusion Industries :: Cg and HLSL FAQ ::”. 2012年8月24日. オリジナルより2012年8月24日時点のアーカイブ。
    5. ^ 「CGチュートリアル - 第1章 はじめに」。developer.download.nvidia.cn
    6. ^ 「Direct3D 9 での HLSL シェーダーの作成 (Windows)」. msdn.microsoft.com . 2021年5月24日.
    7. ^ 「Cg FAQ」. NVIDIA DesignWorks . 2011年3月8日. 2017年5月25日閲覧
    8. ^ 「Cg Toolkit | NVIDIA Developer」。2011年3月8日。
    9. ^ 「Cg 2.0 リリースノート」(PDF) . nvidia.com . 2008年1月.
    10. ^ 「シェーダーモデル5.1オブジェクト」。Microsoft Docs . 2021年2月22日閲覧
    11. ^ 「HLSL シェーダーモデル 6.0」。Microsoft Docs . 2021年2月22日閲覧
    12. ^ ab Mark J. Kilgard、Cg in Two Pages、2003年。
    13. ^ ab 「Cgプロファイルドキュメント」。Nvidia開発者
    14. ^ 「シェーダーモデルとシェーダープロファイル - Win32 アプリ」。docs.microsoft.com 2021年6月30日。
    15. ^ abcdef 「ピクセルシェーダーの違い」。Microsoft Docs . 2020年8月19日. 2021年2月22日閲覧
    16. ^ abcde Peeper, Craig; Mitchell, Jason L. (2003年7月). 「DirectX 9 高レベルシェーダー言語入門」. Microsoft Docs . 2021年2月22日閲覧。
    17. ^ abc Shimpi, Anand Lal . 「NVIDIA、GeForce FX (NV30)を発表」AnandTech . 2013年6月10日時点のオリジナルよりアーカイブ。 2021年2月22日閲覧
    18. ^ Wilson, Derek. 「ATI Radeon X800 Pro and XT Platinum Edition: R420 Arrives」. AnandTech . 2012年9月28日時点のオリジナルよりアーカイブ。 2021年2月22日閲覧
    19. ^ ab Shader Model 3.0、Ashu Rege、NVIDIA Developer Technology Group、2004 年。
    20. ^ ab The Direct3D 10 System、David Blythe、Microsoft Corporation、2006 年。
    21. ^ ab “レジスタ - ps_4_1”. Microsoft Docs . 2019年8月23日. 2021年2月22日閲覧
    22. ^ ab “レジスタ - ps_5_0”. Microsoft Docs . 2019年8月23日. 2021年2月22日閲覧
    23. ^ abcd 「頂点シェーダーの違い」。Microsoft Docs . 2020年8月19日. 2021年2月22日閲覧
    24. ^ 「FXCからDXCへの移植」。GitHub
    25. ^ "microsoft/DirectXShaderCompiler: このリポジトリは、LLVM/Clang をベースにした DirectX Shader Compiler のソースコードをホストしています". Microsoft. 2020年10月21日.
    26. ^ "glslang: GLSL/ESSL用Khronosリファレンスフロントエンド、HLSL用部分的フロントエンド、およびSPIR-Vジェネレーター". Khronos Group. 2020年10月21日.
    27. ^ マット・ターナー。YouTubeの動画
    28. ^ Stenson, Richard; Ho, Chris. 「PS4向けPlayStationシェーディング言語」GDCヨーロッパ2013
    29. ^ 「ReShade FXシェーディング言語」GitHub 2022年2月15日
    30. ^ "shader-slang/slang". The Slang Shading Language. 2025年12月8日.
    31. ^ 「Maya Cg プラグイン | NVIDIA」。
    32. ^ 「LightWave - 11.6 機能の概要」。
    33. ^ 「Unity - マニュアル: シェーダーの作成」。

    さらに読む

    • Randima Fernando、Mark J. Kilgard『CGチュートリアル:プログラマブルリアルタイムグラフィックスの決定版ガイド』、Addison-Wesley Professional、ISBN 0-321-19496-9
    • Randima Fernando, GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics , Addison-Wesley Professional, ISBN 0-321-22832-4
    • William R. Mark、R. Steven Glanville、Kurt AkeleyMark J. Kilgard「Cg: C 風言語でグラフィックス ハードウェアをプログラミングするためのシステム」 、 SIGGRAPH 2003論文集doi :10.1145/1201775.882362
    • cgc-opensrc - NVIDIA のオープンソースコンパイラのミラー、2002
    • いくつかの重要な資料(例えば、デザインペーパー)は、Siggraph 2005 のコースノートにまとめられています。
    • Nvidia がホストする資料:
      • CGに関するよくある質問
      • CGツールキット
      • Cg言語リファレンスとドキュメント
    • NeHe Cg 頂点シェーダーチュートリアル
    • エミュレータで使用される Cg シェーダー標準のドキュメント
    • Aras Pranckevičius、クロス プラットフォーム シェーダー、2014 年。
    • Microsoft Docsの HLSL プログラミング ガイド
    • DirectX 9 高レベルシェーディング言語の紹介、(ATI) AMD 開発者センター
    • Riemer の HLSL 入門とチュートリアル (サンプルコードを含む) 2008 年 11 月 19 日アーカイブ、Wayback Machine
    • HLSLの紹介
    • DirectX中間言語(DXIL)仕様
    「https://en.wikipedia.org/w/index.php?title=High-Level_Shader_Language&oldid=1326468539」から取得
    Original text
    Rate this translation
    Your feedback will be used to help improve Google Translate