最終更新:
mikk_ni3_92 2009年12月10日(木) 19:20:33履歴
現在地:メニュー >> Cg >> Cg編02
Index :Cg編01<< Cg編02 >> Cg編03
CgをOpenGLで使う時の基本的な流れは、
そして、「.cppファイル」に加え、
「頂点シェーダ用の『.cgファイル』」と「フラグメントシェーダ用『.cgファイル』」が必要である。
【頂点シェーダのプログラム例】:vertex.cg
【フラグメントシェーダのプログラム例】:fragment.cg
必要なヘッダファイルは
Cgをセットアップするということは、
コンテキストは「cgCreateContext関数」を使って、次のように作成する。
【例】
頂点シェーダの設定では
【例】
【解説】
cgGLGetLatestProfile(CG_GL_VERTEX);のように「CG_GL_VERTEX」を指定する事で、
「頂点シェーダのプロファイル」が取得できる。
次に、「cgGLSetOptimalOptions関数」でプロファイルに対する最適化オプションを設定。
(GPUやドライバに合わせて最適化するということ)
次に、「cgCreateProgramFromFile関数」を使って、指定のファイルからプログラムオブジェクトを作成する。
最後に「cgGLLoadProgram関数」でプログラムがバインドされるように準備する。
基本的には頂点シェーダの設定と同じ
【例】
有効化する場合は、「cgGLBindProgram関数」でバインドするプログラムを指定、
「cgGLEnableProfile関数」で各種プロファイルを有効化する。
これによって、指定した頂点座標や色が頂点シェーダへ渡される。
後は「.cgファイル」にシェーダを記述すればよい。
Index :Cg編01<< Cg編02 >> Cg編03
CgをOpenGLで使う時の基本的な流れは、
- Cgの各種セットアップ
- 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.h
- cgGL.h
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);
}
有効化する場合は、「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ファイル」にシェーダを記述すればよい。

