現在地メニュー >> Cg >> Cg編02
Index :Cg編01<< Cg編02 >> Cg編03

CgをOpenGLで使う


CgをOpenGLで使う時の基本的な流れは、
  1. Cgの各種セットアップ
  2. Cgを有効化して普通に描画する
である。

そして、「.cppファイル」に加え、
「頂点シェーダ用の『.cgファイル』」と「フラグメントシェーダ用『.cgファイル』」が必要である。

【頂点シェーダのプログラム例】:vertex.cg
//入力頂点
struct VertexIn
{
	float2 position : POSITION;
	float3 color : COLOR;
};

//出力頂点
struct VertexOut
{
	float4 position : POSITION;
	float3 color : COLOR;
};

//-------- 頂点シェーダメイン関数 ---------//
VertexOut CgVertexMain(in VertexIn input)
{
	VertexOut output;//出力用

	output.position = float4(input.position.x,input.position.y,0,1);//位置
	output.color = input.color;//色

	return output;
}

【フラグメントシェーダのプログラム例】:fragment.cg
//フラグメントの入力
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;
}

Cgのセットアップ


必要なヘッダファイルは
  • cg.h
  • cgGL.h
の2つ。

Cgをセットアップするということは、
  • Cgコンテキストを作成
  • プロファイルを取得する
  • シェーダプログラム(GPUのプログラム)との関連付け
をするということである。

◆コンテキスト作成


コンテキストは「cgCreateContext関数」を使って、次のように作成する。

【例】
//Cg用変数
CGcontext CgContext; //コンテキスト

void CgINIT()
{
	//コンテキスト作成
	CgContext = cgCreateContext();
	if(CgContext == NULL){
		std::cerr << "Can't Create Context\n";
		exit(0);
	}

	setUpCgVertex();//頂点シェーダのセットアップ
	setUpCgFragment();//フラグメントシェーダのセットアップ
}
▲「CGcontext型」に「cgCreateContext関数」を使えばよい。

◆頂点シェーダの設定


頂点シェーダの設定では
  • プロファイルの取得
  • 頂点シェーダ用ファイル(vertex.cg)を関連付け
をすればよい。

【例】
CGprofile CgVertexProfile;//頂点シェーダのプロファイル用
CGprogram CgVertexProgram;//頂点シェーダのプログラムの関連付け用
… …

//プロファイルの取得
CgVertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);
if(CgVertexProfile == CG_PROFILE_UNKNOWN)
{
	std::cerr << "Invalid profile type\n";
	exit(0);
}
cgGLSetOptimalOptions(CgVertexProfile);


//ファイルを読んでコンパイル
CgVertexProgram 
	= cgCreateProgramFromFile(
				CgContext,//コンテキスト
				CG_SOURCE,//Cgソースコード
				"vertex.cg", //「.cgファイル名」
				CgVertexProfile, //プロファイル
				"CgVertexMain", //「.cgファイル」で最初にいく関数
				NULL); //NULLでよい

cgGLLoadProgram(CgVertexProgram);//プログラムのロード
if(CgVertexProgram==NULL){
	std::cerr <<"Vertex Program Err. \n";
	exit(0);
}

【解説】
cgGLGetLatestProfile(CG_GL_VERTEX);のように「CG_GL_VERTEX」を指定する事で、
「頂点シェーダのプロファイル」が取得できる。
次に、「cgGLSetOptimalOptions関数」でプロファイルに対する最適化オプションを設定。
(GPUやドライバに合わせて最適化するということ)

次に、「cgCreateProgramFromFile関数」を使って、指定のファイルからプログラムオブジェクトを作成する。
最後に「cgGLLoadProgram関数」でプログラムがバインドされるように準備する。

◆フラグメントシェーダの設定


基本的には頂点シェーダの設定と同じ

【例】
//プロファイルの取得
CgFragmentProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
if(CgFragmentProfile == CG_PROFILE_UNKNOWN){
	std::cerr << "Fragment : profile is unknown\n";
	exit(0);
}
cgGLSetOptimalOptions(CgFragmentProfile);

//プログラムのコンパイル
CgFragmentProgram 
	= cgCreateProgramFromFile(
				CgContext,//コンテキスト
				CG_SOURCE,//Cgソースコード
				"fragment.cg", //「.cgファイル名」
				CgFragmentProfile, //プロファイル
				"CgFragmentMain", //「.cgファイル」で最初にいく関数
				NULL); //NULLでよい

cgGLLoadProgram(CgFragmentProgram); //プログラムのロード
if(CgFragmentProgram==NULL){
	std::cerr <<"Fragment Program Err. \n";
	exit(0);
}

Cgを有効化して普通に描画する


有効化する場合は、「cgGLBindProgram関数」でバインドするプログラムを指定、
「cgGLEnableProfile関数」で各種プロファイルを有効化する。

	cgGLBindProgram(CgVertexProgram);
	cgGLEnableProfile(CgVertexProfile);

	cgGLBindProgram(CgFragmentProgram);
	cgGLEnableProfile(CgFragmentProfile);

	glColor3f(0,1,0);
	glBegin(GL_TRIANGLES);
	glVertex2f(-0.8, 0.8);
	glVertex2f(0.8, 0.8);
	glVertex2f(0.0, -0.8);
	glEnd();

	//Cgの無効化
	cgGLDisableProfile(CgVertexProfile);
	cgGLDisableProfile(CgFragmentProfile);

これによって、指定した頂点座標や色が頂点シェーダへ渡される。
後は「.cgファイル」にシェーダを記述すればよい。

サンプルコード

×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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