Cg(シー・ジー)は、
NVIDIAが開発したリアルタイム
3次元[[コンピュータグラフィックス]](3DCG)におけるプログラマブルシェーダーのための
シェーディング言語です。その名前は「C for Graphics」に由来し、
C言語(
ANSI C)をベースとした
文法を採用しつつ、
C++言語の類似機能も一部取り入れています。
2012年を最後にバージョンアップは終了しましたが、GPU
プログラミングに特化した設計と、その後の言語に与えた影響は注目に値します。
背景
GPU技術の進化に伴い、陰影計算(
シェーディング)を
プログラミング可能なハードウェアが登場しました。初期のGPU
プログラミングは、
Direct3D 8.xや
OpenGL ARB拡張において
アセンブリ言語をベースとしており、開発が難しく生産性や可搬性が低いという課題がありました。そこで、GPU向けの
高水準言語としてCgが開発されました。Cg Toolkit 1.0のベータ版は2002年6月に公開されました。
Cgと並行して、
OpenGLネイティブのGLSL(2003年リリース)やDirectX(
Direct3D)ネイティブのHLSL(2002年末リリース)といった類似のGPU用
高水準言語も登場しましたが、Cgは特にHLSLに近い
文法を持ちます。GLSLが
OpenGL専用、HLSLが
Direct3D専用であるのに対し、Cgは両方のAPIに対応しており、
OpenGLと
Direct3Dの両方を基盤としてCgシェーダープログラムを実行できる点が特徴です。
さらに、
NVIDIAの
GPGPU開発環境である
CUDA用に拡張されたC/
C++では、Cgによく似たデータ型や組み込み関数が実装されており、Cgが後発の言語にも影響を与えていることがわかります。
詳細
データ型
Cgは、以下の基本データ型をサポートしています。
`float`: IEEE 754準拠の32ビット単精度浮動小数点数。
`half`: 16ビット
半精度浮動小数点数。
`int`: 2の補数による符号付き32ビット整数型(プロファイルによっては`float`として扱う)。
`unsigned int`: 符号無し
整数型(`int`に`unsigned`を付与)。
`char`, `short`, `long`: 整数型で、`sizeof(char) < sizeof(short) < sizeof(int) <= sizeof(long)`の関係を満たす。
`fixed`: 12ビット
固定小数点数。
`bool`: 論理型。
`sampler
`: テクスチャオブジェクト型。
また、固定長配列や構造体をサポートし、ポインタの代わりに配列を第一級オブジェクトとして扱います。`packed`修飾子を配列に指定することで、`packed array`型を定義できます。さらに、`float4`や`float4x4`のように、ベクトル型や行列型のエイリアスが事前定義されており、3次元[[コンピュータグラフィックス]]計算で多用されます。
演算子
Cgは、C言語で用いられる算術演算子や論理演算子をサポートしています。これらの演算子はベクトル型や行列型にも適用でき、C++言語の演算子オーバーロードのように、可読性の高いグラフィックスプログラムを記述できます。
関数と制御構造
CgはC言語と同様の制御構造を持ち、関数を定義できます。関数の引数は既定で値渡しであり、`in`、`out`、`inout`、`uniform`の修飾子を指定することも可能です。
標準ライブラリ
Cgには、GPUプログラミング用の標準ライブラリがあり、C言語の標準ライブラリと共通の数学関数(`abs()`、`sin()`など)に加え、テクスチャマッピングに特化した関数(`tex1D()`、`tex2D()`など)が用意されています。
ランタイムライブラリ
Cgプログラムは主に頂点やピクセルのシェーディングを行うためのものであり、レンダリングプロセスや入出力を扱うにはC/C++ホストプログラムが必要です。CgはOpenGLやDirectXのAPI基盤上で動作しますが、各APIと連携させるためのライブラリがNVIDIAから提供されています。
対応プロファイル
Cgで使用可能なシェーダープログラムのプロファイルは、Cg Toolkit 3.1(2012年2月リリース)時点で、以下のようになっています。
OpenGL
NVIDIA Vertex Program 5.0 まで
NVIDIA Fragment Program 5.0 まで
NVIDIA Geometry Program 5.0 まで
NVIDIA Tessellation Control Program 5.0 まで
NVIDIA Tessellation Evaluation Program 5.0 まで
DirectX 11.0
HLSL Vertex Shader 5.0 まで
HLSL Pixel Shader 5.0 まで
HLSL Geometry Shader 5.0 まで
HLSL Hull Shader 5.0 まで
HLSL Domain Shader 5.0 まで
DirectX 10.0
HLSL Vertex Shader 4.0 まで
HLSL Pixel Shader 4.0 まで
HLSL Geometry Shader 4.0 まで
DirectX 9.0c
HLSL Vertex Shader 3.0まで
HLSL Pixel Shader 3.0まで
OpenGL 4.3とDirectX 11でCompute Shaderが導入されましたが、Cgは最終バージョン3.1で対応していません。
CgFX
Cg言語は、複数のシェーダープログラムを組み合わせた処理パイプラインを「Technique」として管理する「CgFX」Effectフレームワークも備えています。これにより、個別にシェーダープログラムを管理するよりもパイプラインの構築が容易になります。Effectには複数のTechniqueが含まれ、Techniqueには複数のPassが含まれます。
サンプルコード
Cgのサンプルコードは割愛します。
FX Composer
Cgを使ったシェーダーオーサリングツールとして「FX Composer」が
NVIDIAから提供されていましたが、DirectX 10対応のv2.5を最後に開発が終了しました。
nvFX
Cgは
2012年4月のバージョン3.1.0013を最後に更新されておらず、開発は終了しています。ランタイムの提供は継続されるものの、将来のハードウェア機能はサポートされないため、新規開発での採用は推奨されていません。後継として、クロスプラットフォームなシェーダーエフェクトフレームワーク「nvFX」が開発されています。nvFXはHLSLやGLSLをバックエンドとし、
OpenGL ESもサポートしています。
採用例・実績
Cgは以下のソフトウェアやプラットフォームで採用されていました。
LightWave (バージョン11.6でCgFXを採用)
Maya
PlayStation 3
Adobe Photoshop
Unity (ゲームエンジン)
Far Cry
関連項目
コンピュータグラフィックス
OpenGL
DirectX
GLSL
HLSL
CUDA
Crystal Space
OGRE
en:ARB assembly language
外部リンク
公式ウェブサイト