Cg(プログラミング言語)

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

Cg ( C for Graphicsの略)は、 High-Level Shader Language (HLSL)とも呼ばれ、 NVIDIAMicrosoftがシェーダープログラミング用に開発した高水準シェーディング言語です。Cg/HLSLはCプログラミング言語をベースにしており、コアとなる構文は同じですが、Cの一部の機能が変更され、新しいデータ型が追加されているため、Cg/HLSLはグラフィックス処理ユニットのプログラミングにより適しています。[1] [2]

Cg/HLSL言語には、DirectXまたはOpenGLを出力するNvidia Cgコンパイラ(cgc)と、バイトコード形式でDirectXシェーダを出力するMicrosoft HLSLの2つの主要なブランチがあります。[3] [4] Nvidiaのcgcは2012年に廃止され、追加の開発やサポートは利用できなくなりました。 [5]

HLSLシェーダーは、2Dおよび3Dコンピュータグラフィックスにおいて多くの特殊効果を実現できます。Cg/HLSL言語は当初、頂点シェーダーピクセルシェーダーのみをサポートしていましたが、徐々に他の種類のシェーダーも導入されました。

背景

グラフィックスハードウェアの技術的進歩により、3Dグラフィックスプログラミングの一部の領域は非常に複雑になっています。プロセスを簡素化するために、グラフィックスカードには、頂点シェーダーやピクセルシェーダーを使用してレンダリングパイプラインを変更する機能など、新しい機能が追加されました。

当初、頂点シェーダーとピクセルシェーダーは、グラフィックス処理ユニット(GPU)のアセンブリ言語のみを用いた非常に低レベルでプログラミングされていました。アセンブリ言語を使用することで、プログラマーはコードを完全に制御でき、柔軟性も向上しましたが、使い勝手はかなり悪かったです。GPUプログラミングには、移植性の高い高水準言語が必要でした。そこで、これらの問題を克服し、シェーダー開発を容易にするためにCgが開発されました。

アセンブリよりも Cg を使用する利点は次のとおりです。

  • 高レベルのコードは、アセンブリ コードよりも学習、プログラミング、読み取り、保守が簡単です。
  • Cg コードは、通常、それが記述されているハードウェアとプラットフォームに依存するアセンブリ コードとは異なり、幅広いハードウェアとプラットフォームに移植可能です。
  • Cg コンパイラはコードを最適化し、アセンブリでは実行が難しくエラーが発生しやすい低レベルのタスクを自動的に実行できます。

言語

データ型

Cgには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[7]

HLSL機能

  • 名前空間
  • 注釈

環境

コンパイル対象

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

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

HLSLピクセルシェーダーの比較
ピクセルシェーダーバージョン1.0から1.3 [10]1.4 [10]2.0 [10] [11]2.0a [10] [11] [12]2.0b [10] [11] [13]3.0 [10] [14]4.0 [15]
4.1 [16]
5.0 [17]
依存テクスチャ制限468無制限8無制限無制限
テクスチャ命令の制限46*232無制限無制限無制限無制限
ポジションレジスタいいえいいえいいえいいえいいえはいはい
命令スロット8+48+432 + 64512512≥ 512≥ 65536
実行された命令8+46*2+8*232 + 6451251265536無制限
テクスチャの間接指定444無制限4無制限無制限
補間レジスタ2 + 42 + 62 + 82 + 82 + 81032
命令述語いいえいいえいいえはいいいえはいいいえ
インデックス入力レジスタいいえいいえいいえいいえいいえはいはい
温度レジスタ2612から322232324096
定数レジスタ8832323222416×4096
任意のスウィズリングいいえいいえいいえはいいいえはいはい
グラデーションの指示いいえいいえいいえはいいいえはいはい
ループカウントレジスタいいえいいえいいえいいえいいえはいはい
顔認識(両面照明)いいえいいえいいえいいえはいはいはい
動的フロー制御いいえいいえいいえいいえいいえはい (24)はい (64)
ビット演算子いいえいいえいいえいいえいいえいいえはい
ネイティブ整数いいえいいえいいえいいえいいえいいえはい
  • PS 1.0 — 未リリースの3dfx Rampage、DirectX 8。
  • PS 1.1GeForce 3、DirectX 8。
  • PS 1.23Dlabs Wildcat VP、DirectX 8.0a。
  • PS 1.3GeForce 4 Ti、DirectX 8.0a。
  • 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。

実行命令の「32 + 64」は、「32 個のテクスチャ命令と 64 個の算術命令」を意味します。

HLSL頂点シェーダーの比較
頂点シェーダバージョンVS 1.1 [18]VS 2.0 [11] [18] [19]VS 2.0a [11] [18] [19]VS 3.0 [14] [18]VS 4.0 [15]
VS 4.1 [20]
VS 5.0 [17]
命令スロット数128256256≥ 512≥ 65536
実行される命令の最大数12810246553665536無制限
命令述語いいえいいえはいはいはい
温度レジスタ121216324096
# 定数レジスタ≥ 96≥ 256256≥ 25616×4096
静的フロー制御いいえはいはいはいはい
動的フロー制御いいえいいえはいはいはい
動的フロー制御の深さ242464
頂点テクスチャフェッチいいえいいえいいえはいはい
テクスチャサンプラーの数4128
ジオメトリインスタンス化のサポートいいえいいえいいえはいはい
ビット演算子いいえいいえいいえいいえはい
ネイティブ整数いいえいいえいいえいいえはい

標準ライブラリ

C言語と同様に、Cg/HLSLにはGPUプログラミングの一般的なタスクに対応する関数セットが用意されています。数学関数absやsinのようにC言語に同等の機能を持つ関数もあれば、テクスチャマッピング関数tex1Dやtex2DのようにGPUプログラミングタスクに特化した関数もあります。

Cgランタイムライブラリ

Cgプログラムは単なる頂点シェーダーとピクセルシェーダーであり、残りのレンダリングプロセスを処理するサポートプログラムが必要です。CgはOpenGLまたはDirectXという2つのグラフィックスAPIで使用できます。それぞれに、現在のCgシェーダーの設定、パラメータの受け渡しなどのCgプログラムとの通信を行うための独自のCg関数セットがあります。

Cgのソースコードをアセンブリコードにコンパイルできることに加えて、Cgランタイムは、サポートプログラムの実行中にシェーダーをコンパイルする機能も備えています。これにより、ランタイムは、プログラムが現在実行されているハードウェアで利用可能な最新の最適化を使用してシェーダーをコンパイルできます。ただし、この手法では、シェーダーのソースコードがコンパイラに対してプレーンテキストで利用可能である必要があり、プログラムのユーザーがシェーダーのソースコードにアクセスできるようになります。一部の開発者は、これをこの手法の大きな欠点と見ています。

シェーダーのソースコードを公開せずに、ハードウェア固有の最適化の一部を維持するために、「プロファイル」という概念が開発されました。シェーダーは、プロファイルに基づいて、さまざまなグラフィックハードウェアプラットフォームに合わせてコンパイルできます。サポートプログラムを実行すると、プロファイルに基づいて最適かつ最適化されたシェーダーが読み込まれます。例えば、複雑なピクセルシェーダーをサポートするグラフィックカード用のプロファイルと、最小限のピクセルシェーダーのみをサポートするグラフィックカード用のプロファイルが存在する場合があります。サポートプログラムは、これらのプロファイルごとにピクセルシェーダーを作成することで、強力なシステムでも画質を犠牲にすることなく、サポートされるハードウェアプラットフォームの数を増やすことができます。

コンパイラと方言

Cg 方言には、これまで Nvidia の Cg ツールキットという形式のコンパイラが 1 つしかありませんでした。

MicrosoftはHLSL用の2つのコンパイラをリリースしました。最初のコンパイラはクローズドソースのFXC(Effect Compiler)で、2015年までサポートされていました。しかし、オープンソースのLLVMベースのDXC(DirectXShaderCompiler)に置き換えられ、より新しいHLSL機能をサポートしました。[21]どちらのコンパイラもバイトコードを生成します。以前のFXCはDXBCを使用していましたが、現在のDXCはDXILを使用しています。また、DXCはSPIR-Vバイトコードも生成できます[22]

Khronos Groupは、GLSLからSPIR_Vへのコンパイラであるglslangのフロントエンドとして、LLVMベースのHLSLコンパイラも開発しました。SPIR_Vのサポートにより、シェーダーはクロスプラットフォーム化され、DirectXスタックに限定されなくなりました。[23]この作業は以前はHLSL2GLSLのようなソースレベルのコンバータによって行われていましたが、結果として得られるコードは肥大化してしまうことが多かったです。[24]

派生言語

PlayStation Shader Language(PSSL)はCg/HLSLに基づいています。[25]

ReshadeFXシェーディング言語もCg/HLSLに基づいています。ReshadeFXで記述されたシェーダーはOpenGL、DX、またはVulkanにコンパイルされ、ゲームに注入されてポストプロセスフィルターとして機能します。[26]

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

参照

参考文献

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