最終更新: mikk_ni3_92 2010年02月16日(火) 18:12:04履歴
現在地:メニュー >> Cg >> CgFX編01
INDEX: CgFX編00 << CgFX編01 >> CgFX編02?
CgFXの使用手順は次の通り
【例】
コンテキストはCgと同様に作成する。
次に「cgGLRegisterStates関数」を使って「CgFX」とコンテキストを関連付ける。
続いて「cgCreateEffectFromFile関数」で「.cgfxファイル」を読み込む。
返り値は「CGeffect型」。(第3引数はとりあえず「NULL」でいい)
最後に「CGeffect型」のオブジェクトから「CGtechniqueオブジェクト」を取り出す。
例では「cgGetFirstTechnique関数」使うことで、
注目している「CGeffectオブジェクト」の先頭の「Technique」を取り出している。
※次の「Technique」を取り出したい場合は、「cgGetNextTechnique(techniques)」のようにする。
CPU側との変数名の関連付けは「cgGetNamedEffectParameter」という関数になる。
描画時は「CGpass型」のオブジェクトを使って、
注目「Technique」のどの「Pass」を使うのかを設定して描画する。
【例】
「.cgfx」ファイルは次のような構成が基本的な感じ
【例】:myCgEffect.cgfx
「VertexShader = compile ...」で頂点シェーダを指定し、
「PixelShader = compile ...」でフラグメントシェーダを指定する。
compileの次にある「arbvp1」等の部分は頂点/フラグメントシェーダのプロファイルを表す。
■頂点シェーダのプロファイル
INDEX: CgFX編00 << CgFX編01 >> CgFX編02?
CgFXの使用手順は次の通り
- コンテキスト作成
- CgFXの設定
- コンテキスト登録
- 「.cgfxファイル」読み込む
- 「.cgfxファイル」内のTechniqueを取り出す
- (※CPUの変数との関連付け)
- 描画
- 取り出した現在の「Technique」から「Pass」を取り出す
- 「Pass」を指定して描画
【例】
CGcontext CgContext; //コンテキスト CGeffect effect;//Cgfxのエフェクト変数 CGtechnique techniques;//CgFXのテクニック変数 CGparameter CgModelViewProj; //CGparameter型(ModelProj行列を取得) //コンテキスト作成 CgContext = cgCreateContext(); if(CgContext == NULL){ std::cerr << "Can't Create Context\n"; exit(0); } //ここからCgFXの設定 cgGLRegisterStates(CgContext);//cgfx用にコンテキストを登録 //CgFXファイルを読み込む effect = cgCreateEffectFromFile(CgContext,"myCgEffect.cgfx",NULL); if (!effect) { fprintf(stderr, "Unable to create effect!\n"); const char *listing = cgGetLastListing(CgContext); if (listing){ fprintf(stderr, "%s\n", listing); } exit(1); } //テクニックを取り出す techniques = cgGetFirstTechnique(effect);//一番先頭のテクニックを取得 //関連付け CgModelViewProj = cgGetNamedEffectParameter(effect, "WorldViewProjection");//「.cgfxファイル」内での変数名を決定【解説】
コンテキストはCgと同様に作成する。
次に「cgGLRegisterStates関数」を使って「CgFX」とコンテキストを関連付ける。
続いて「cgCreateEffectFromFile関数」で「.cgfxファイル」を読み込む。
返り値は「CGeffect型」。(第3引数はとりあえず「NULL」でいい)
最後に「CGeffect型」のオブジェクトから「CGtechniqueオブジェクト」を取り出す。
例では「cgGetFirstTechnique関数」使うことで、
注目している「CGeffectオブジェクト」の先頭の「Technique」を取り出している。
※次の「Technique」を取り出したい場合は、「cgGetNextTechnique(techniques)」のようにする。
CPU側との変数名の関連付けは「cgGetNamedEffectParameter」という関数になる。
描画時は「CGpass型」のオブジェクトを使って、
注目「Technique」のどの「Pass」を使うのかを設定して描画する。
【例】
CGpass pass; pass = cgGetFirstPass(techniques);//注目テクニックからパスを取り出す while(pass) { cgSetPassState(pass);//パスセット Draw();//描画 cgResetPassState(pass);//パスのリセット pass = cgGetNextPass(pass); }
「.cgfx」ファイルは次のような構成が基本的な感じ
- techniqueを記述(複数個OK)
- techniqueの中にpassを記述(複数個OK)
- シェーダを記述する
- その他:CPUから渡される外部変数を書いておく
【例】:myCgEffect.cgfx
//cgfxのグローバル変数 //4x4の透視投影変換行列を取得 float4x4 WorldViewProjection; //-----------------------------------------------------------// // ここから頂点シェーダの記述 // //-----------------------------------------------------------// //入力頂点 struct VertexIn { float4 position : POSITION; float3 color : COLOR; }; //出力頂点 struct VertexOut { float4 position : POSITION; float3 color : COLOR; }; //-------- 頂点シェーダメイン関数 ---------// VertexOut CgVertexMain(in VertexIn input,uniform float4x4 modelViewProj) { VertexOut output;//出力用 output.position = mul(modelViewProj, input.position); output.color = input.color;//色 return output; } //-----------------------------------------------------------// // ここからフラグメントシェーダの記述 // //-----------------------------------------------------------// //フラグメントの入力 struct FragmentIn { float4 position : POSITION; //ラスタライズ用(使用しない) float3 color : COLOR; }; //フラグメントの出力 struct FragmentOut { float3 color : COLOR; }; //--------- フラグメントシェーダメイン関数 ------------// FragmentOut CgFragmentMain(in FragmentIn input) { FragmentOut output;//フラグメント出力 output.color = input.color; return output; } //テクニック technique Technique0 { pass Pass0 { Zenable = true;//デプステストON VertexShader = compile arbvp1 CgVertexMain( WorldViewProjection ); PixelShader = compile arbfp1 CgFragmentMain(); } }【解説】
「VertexShader = compile ...」で頂点シェーダを指定し、
「PixelShader = compile ...」でフラグメントシェーダを指定する。
compileの次にある「arbvp1」等の部分は頂点/フラグメントシェーダのプロファイルを表す。
■頂点シェーダのプロファイル
- arbvp1 → GeForce3 and Quadro DCC など
- vp20 → GeForce3, GeForce4 Ti, Quadro DCC, など
- vp30 → GeForce FX and Quadro FX など
- vp40 → GeForce 6xxx や 7xxx シリーズ, NV4x-based Quadro FXなど
- gp4vp → GeForce 8xxx シリーズ, G8x-based Quadro FXなど
- arbfp1 → GeForce FXかそれ以上
- fp20 → GeForce3, GeForce4 Ti, Quadro DCCなど
- fp30 → GeForce FX and Quadro FX
- fp40 → GeForce 6xxx や 7xxx シリーズ, NV4x-based Quadro FXなど
- gp4fp → GeForce 8xxx シリーズ, G8x-based Quadro FXなど
- gp4gp → GeForce 8xxx & 9xxx シリーズ, G8x-based Quadro FX, など