Cg (プログラミング言語)
CgはNVIDIAが開発したプログラミング言語である。GPUプログラミングのために特化・最適化されており、CG描画に向いている。この言語名の由来は「グラフィックスのためのC言語」(C for Graphics)であり、C言語をベースとした文法を持つ。また、C++言語の類似機能も一部取り入れている。
目次
背景
グラフィックスカードの技術的な発展にともない、プログラミング可能なグラフィックスカードが開発されるようになった。しかしそれらのカードにおけるプログラミングはアセンブラをベースとしたもので、開発が難しく可搬性も低かった。そのため、GPU向けの高級言語が必要とされるようになり、Cgが開発された。
なお、類似のGPU用高級言語として、OpenGLネイティブのGLSLおよびDirectX(Direct3D)ネイティブのHLSLが存在するが、Cgはどちらかというと(マイクロソフトとNVIDIAが共同開発した)HLSLにより近い文法となっている。
詳細
データ型
Cgは6つの基本データ型を持っている。
- float - 32ビット浮動小数点型
- half - 16ビット浮動小数点型
- int - 32ビット整数型
- fixed - 12ビット固定小数点型
- bool - 論理型
- sampler* - テクスチャオブジェクト型
Cgにはその他にも、float3やfloat4x4のように、ベクトルや行列そのものを扱う型がある。これらは3次元のコンピュータグラフィックス計算において多用される型である。また、配列や構造体も用意されている。
演算子
CgはC言語で用いられる算術演算子や論理演算子をサポートしている。算術演算子はベクトル型や行列型にも適用できるものがあり、(C++言語の演算子オーバーロードのように)プログラムの可読性を高め、直感的に理解しやすいグラフィックスプログラムを書くことができるようになっている。
関数と制御構造
CgはC言語と同様の制御構造を持ち、関数を定義するのと似たようなこともできる。
標準ライブラリ
C言語と同様に、CgにはGPUプログラミングのための標準ライブラリがある。absやsinなど、C言語の標準ライブラリと共通の数学関数がある一方で、テクスチャマッピングのためのtext1Dやtext2Dなど、GPUプログラミングに特化した関数も用意されている。
ランタイムライブラリ
Cgによるプログラムは基本的に頂点やピクセルのシェーディングを行うためのものであり、そのほかのレンダリングプロセスを扱うためのC/C++ホストプログラムを必要とする。CgはOpenGLやDirectXのAPIを通して使用することができる。
対応プロファイル
Cgで使用可能なシェーダープログラムのプロファイル、すなわちOpenGLやDirectXにおけるシェーダーモデルのバージョンは、2012年2月リリースのCg Toolkit 3.1時点では、リファレンスマニュアルによると下記のようになっている。
- 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言語は複数のシェーダープログラムを組み合わせた一連の処理パイプライン(Pass)およびそれらの入出力をまとめてひとつの「Technique」として管理することのできるEffectフレームワーク「CgFX」も同時に備えている。これはDirect3D 9やDirect3D 11の拡張ライブラリ(D3DX9、D3DX11)およびDirect3D 10のコアライブラリでサポートされているEffectフレームワークとよく似ており、個別にパイプラインステージごとのシェーダープログラムおよびその入出力を管理するよりもずっとシェーダープログラムのパイプラインを構築しやすくなる。 Effectには複数のTechniqueを含むことができ、Techniqueには複数のPassを含むことができる。
サンプルコード
// input vertex
struct VertIn {
float4 pos : POSITION;
float4 color : COLOR0;
};
// output vertex
struct VertOut {
float4 pos : POSITION;
float4 color : COLOR0;
};
// vertex shader main entry
VertOut main(VertIn input, uniform float4x4 modelViewProj) {
VertOut output;
output.pos = mul(modelViewProj, input.pos); // calculate output coords
output.color = input.color; // copy input color to output
output.color.z = 1.0f; // blue component of color = 1.0f
return output;
}
nvFX
Cgはバージョン3.1を最後に更新がなされておらず、また(将来の新しいハードウェア機能をサポートしないため)新規開発での採用は推奨されていない[1]が、後継のクロスプラットフォームなシェーダーエフェクトフレームワークとして、NVIDIAによってnvFXが開発されている [2]。nvFXはOpenGL ESもサポートし、モバイルなどの組み込み機器もターゲットとなる。
採用例
- LightWave
LightWaveはバージョン11.6でCgFXを採用する予定である。CgFXによってリアルタイムプレビュー時の法線マッピング機能などが追加されるほか、ユーザーが独自のカスタムシェーダーを実装して利用することができるようになる[3]。
- Maya
- PlayStation 3