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

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

背景

GPUの技術的な発展にともない、アプリケーションソフトウェアのプログラマーが陰影計算処理(シェーディング)をプログラミング可能なハードウェアが開発・提供されるようになった。しかしDirect3D 8.xやOpenGL ARB拡張における最初期のGPUプログラミングは低水準言語アセンブリ言語)をベースとしたもので、APIの実装が提供するランタイムライブラリおよびデバイスドライバーに含まれるアセンブラが解釈可能なニーモニックを利用してプログラムを記述する必要があったため、開発が難しく生産性や可搬性も低かった。そのため、GPU向けの高水準言語が必要とされるようになり、Cgが開発された。Cg Toolkit 1.0のベータ版は2002年6月に公開された[1]

なお、類似のGPU用高水準言語として、OpenGLネイティブのGLSL(2003年にOpenGL 1.5の拡張機能としてリリース)およびDirectXDirect3D)ネイティブのHLSL(2002年末にDirectX 9.0の標準機能としてリリース)が存在するが、Cgはどちらかというと(マイクロソフトとNVIDIAが共同開発した)HLSLにより近い文法となっている。

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

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

詳細

データ型

Cgはいくつかの基本データ型を持っている[2]

intのサポートは任意であり、プロファイルによってはfloatとして扱うこともある。
各整数型にはunsignedを付けることで符号無し整数型とすることができる。
  • 以下の関係を満たす整数型charshortlong
sizeof(char) < sizeof(short) < sizeof(int) <= sizeof(long)

Cgは配列(固定長配列)や構造体もサポートする。ポインタをサポートしない代わりに、配列は第一級オブジェクトである[2]。また、配列にpacked型修飾子を指定することで、packed array型[2]を定義することができる。基本数値型に関して、例えばfloat4float4x4のように、4次元までのベクトル型と4×4次元までの行列型のエイリアスがあらかじめ定義されている。これらはベクトル行列そのものを扱う型として、3次元のコンピュータグラフィックス計算において多用される型である。

演算子

CgはC言語で用いられる算術演算子や論理演算子をサポートしている。算術演算子はベクトル型や行列型にも適用できるものがあり、(C++言語の演算子オーバーロードのように)プログラムの可読性を高め、直感的に理解しやすいグラフィックスプログラムを書くことができるようになっている。

関数と制御構造

CgはC言語と同様の制御構造を記述するための構文を持つ。関数を定義することもできる。パラメータは既定で値渡しであり、in/out/inout/uniformの修飾子を指定することもできる。

標準ライブラリ

C言語と同様に、CgにはGPUプログラミングのための標準ライブラリがある。abs()sin()など、C言語の標準ライブラリと共通の数学関数がある一方で、テクスチャマッピングのためのtex1D()tex2D()など、GPUプログラミングに特化した関数も用意されている[3]

ランタイムライブラリ

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を最後に開発が終了している[4]

nvFX

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

採用例・実績

  • LightWave - LightWaveはバージョン11.6でCgFXを採用している。CgFXによってリアルタイムプレビュー時の法線マッピング機能などが追加されるほか、ユーザーが独自のカスタムシェーダーを実装して利用することができるようになる[8]
  • Maya [9]
  • PlayStation 3 [10]
  • Adobe Photoshop [11]
  • Unity (ゲームエンジン) [12]
  • Far Cry [13]

脚注

  1. ^ NVIDIA、グラフィックス言語「Cg(C for graphics)」を公開
  2. ^ a b c Cg language | NVIDIA Developer Zone
  3. ^ Cg Standard Library Documentation | NVIDIA Developer Zone
  4. ^ FX Composer
  5. ^ Cg Toolkit: "Cg 3.1 is our last release and while we continue to make it available to developers, we do not recommend using it in new development projects because future hardware features may not be supported."
  6. ^ nvFX: A New Scene and Material Effect Framework for OpenGL and DirectX
  7. ^ tlorach/nvFX: Generic Effect system for Graphic API's (OpenGL and DirectX)
  8. ^ LightWave - LightWave 3D Group Unveils LightWave 116
  9. ^ Maya ユーザ ガイド: CgFX シェーダを操作する
  10. ^ NVIDIAに聞く、GPUプログラミングの最新動向:CodeZine
  11. ^ Windows版Photoshop CS5には、cg.dllおよびcgGL.dllランタイム 2.0.0015が同梱されている。
  12. ^ Cg Programming/Unity - Wikibooks, open books for an open world
  13. ^ Cg - OpenGL.org

関連項目

外部リンク

  • 公式ウェブサイト
企業
人物
  • ジェンスン・フアン
  • クリス・マラコウスキー(英語版)
  • カーティス・プリエム(英語版)
  • デイビッド・カーク(英語版)
  • ビル・ダリー
  • デボラ・ショキスト
  • ランガ・ジャヤラマン
  • ジョナ・アルベン
買収企業
  • 3dfx Interactive
  • AGEIA Technologies(英語版)
  • ULi
  • ARMホールディングス
  • Icera(英語版)
  • Mellanox Technologies(英語版)
  • Mental Images(英語版)
  • PortalPlayer(英語版)
  • Exluna
  • MediaQ
  • Stexar
製品・
サービス
GPU
WSHPC向け
ゲーム機向け
SoC・組み込み機器
  • GoForce(英語版)
  • DRIVE(英語版)
  • Jetson
  • Tegra
NVIDIA SHIELD
  • SHIELD Portable
  • SHIELD タブレット(英語版)
  • SHIELD TV(英語版)
  • GeForce Now(英語版)
その他
  • ION
  • nForce
  • DGX(英語版)
ソフトウェア・技術
マルチメディア・
アクセラレーション
  • NVENC(英語版)
  • PureVideo(英語版)
ソフトウェア
  • Cg
  • CUDA
  • Gelato
  • GameWorks(英語版)
    • OptiX(英語版)
    • PhysX
  • RTX(英語版)
  • Share
  • System Tools(英語版)
  • VDPAU(英語版)
技術
GPUマイクロ
アーキテクチャ
  • Tesla(英語版)
  • Fermi(英語版)
  • Kepler(英語版)
  • Maxwell(英語版)
  • Pascal
  • Volta(英語版)
  • Turing(英語版)
  • Ampere(英語版)
  • Hopper(英語版)
  • カテゴリ カテゴリ
  • コモンズ コモンズ
  • K&R
  • ANSI C
    • C89
    • C90
  • C99
  • C11
  • C17(英語版)
  • C2x(英語版)
  • Embedded C(英語版)
  • MISRA C
Cの機能
  • 関数
  • ヘッダファイル
  • 演算子
  • 文字列(英語版)
  • 文法(英語版)
  • プリプロセッサ(英語版)
  • データ型(英語版)
  • キーワード
  • フリースタンディング環境
  • 標準Cライブラリの関数
    • ctype.h(英語版)
    • stdio.h
    • math.h(英語版)
    • stdlib.h(英語版)
    • string.h(英語版)
    • time.h
    • stdarg.h(英語版)
    • POSIXライブラリ(英語版)
    標準Cライブラリ
    コンパイラ
    統合開発環境
    派生言語
    関連項目
    • カテゴリ カテゴリ