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

Cg: NVIDIAによるGPU向けシェーディング言語



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に対応しており、OpenGLDirect3Dの両方を基盤としてCgシェーダープログラムを実行できる点が特徴です。

さらに、NVIDIAGPGPU開発環境である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

外部リンク



公式ウェブサイト

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。