現在地メニュー >> Cg >> CgFX編01
INDEX: CgFX編00 << CgFX編01 >> CgFX編02?

CgFXの使い方


CgFXの使用手順は次の通り
  1. コンテキスト作成
  2. CgFXの設定
    1. コンテキスト登録
    2. 「.cgfxファイル」読み込む
    3. 「.cgfxファイル」内のTechniqueを取り出す
    4. (※CPUの変数との関連付け)
  3. 描画
    1. 取り出した現在の「Technique」から「Pass」を取り出す
    2. 「Pass」を指定して描画

コンテキスト作成、CgFXの設定


【例】
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ファイルの書き方


「.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, など

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます