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

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

CgNVIDIAが開発していた、リアルタイム3次元コンピュータグラフィックスにおけるプログラマブルシェーダーのためのシェーディング言語である。2012年を最後にバージョンアップは終了している。GPUプログラミングのために特化・最適化されており、CG描画に向いている。この言語名の由来は「グラフィックスのためのC言語」(C for Graphics) であり、C言語をベースとした文法を持つ。また、C++言語の類似機能も一部取り入れている。

背景[編集]

グラフィックスカード(GPU)の技術的な発展にともない、プログラマーが陰影計算処理(シェーディング)をプログラミング可能なハードウェアが開発されるようになった。しかし最初期のGPUプログラミングはアセンブラをベースとしたもので、開発が難しく生産性や可搬性も低かった。そのため、GPU向けの高級言語が必要とされるようになり、Cgが開発された。

なお、類似のGPU用高級言語として、OpenGLネイティブのGLSLおよびDirectXDirect3D)ネイティブのHLSLが存在するが、Cgはどちらかというと(マイクロソフトとNVIDIAが共同開発した)HLSLにより近い文法となっている。

GLSLはOpenGL専用であり、またHLSLはDirect3D専用であるが、Cg言語およびCgランタイムライブラリは両方のAPIに対応しているという特徴を持っている。つまり、OpenGLおよびDirect3Dの両方を、Cgシェーダープログラムを実行する基盤として利用することができる。

NVIDIAのGPGPU開発・実行環境であるCUDA用に拡張されたC/C++では、Cgによく似たデータ型や組み込み関数が実装されているなど、Cgは後発の言語にも影響を及ぼしている。

詳細[編集]

データ型[編集]

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はOpenGLDirectXAPI基盤上で動作させることができるが、Cgシェーダープログラムを各APIと連携・バインドさせるためのライブラリがNVIDIAから提供されている。

対応プロファイル[編集]

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;
}

FX Composer[編集]

Cgを使ったシェーダーオーサリングツールとして、FX Composerと呼ばれるソフトウェアがNVIDIAによって開発・提供されていたが、DirectX 10に対応するv2.5を最後に開発が終了している[1]

nvFX[編集]

Cgは2012年4月リリースのバージョン3.1.0013を最後に更新がなされておらず、開発が終了している。 なお開発者へのCgランタイム自体の提供自体は継続されるものの、将来の新しいハードウェア機能をサポートしないため、新規開発での採用は推奨されていない[2]。 後継のクロスプラットフォームなシェーダーエフェクトフレームワークとして、NVIDIAによってnvFXが開発されている [3]。 nvFXはHLSLやGLSLをバックエンドとするが、OpenGL ESもサポートし、モバイルなどの組み込み機器もターゲットとなる。

採用例・実績[編集]

関連項目[編集]

参照[編集]

外部リンク[編集]