最終更新: mikk_ni3_92 2008年11月24日(月) 14:43:26履歴
現在地:メニュー >> サンプルコード::Cg >> Cg::基本編03 >> Cg::基本編03まとめ2
関連:Cg::基本編03まとめ1
関連:Cg::基本編03まとめ1
//-------- 各種データ構造 --------// struct InputVertex //入力データ構造 { float2 position : POSITION; float3 color : COLOR; }; struct OutputVertex //出力データ構造 { float4 position : POSITION; float3 color : COLOR; }; //-------- 頂点シェーダメイン関数 ---------// OutputVertex Cg_Main(in InputVertex input) //OutputVertex型を出力として返す { OutputVertex OUT; OUT.position = float4(input.position,0,1); // float4(input.position.x,input.position.y,0,1)でもいい。 OUT.color = input.color; return OUT; }
//-------- 各種データ構造 --------// struct OutputColor //出力データ構造 { float3 color : COLOR; }; //--------- フラグメントシェーダメイン関数 ------------// OutputColor Cg_Fragment_Main(in float3 color : COLOR) //OutputColor型を出力として返す { OutputColor OUT; OUT.color = color; return OUT; }
#include <iostream> #include <GL/glut.h> #include <Cg/cg.h> #include <Cg/cgGL.h> //-------- 各種外部変数 -------------// //Cg用変数 CGcontext CgContext; //コンテキスト CGprofile CgVertexProfile;//頂点 CGprogram CgVertexProgram; CGprofile CgFragmentProfile;//フラグメント CGprogram CgFragmentProgram; //-------- プロトタイプ宣言 -----// void SET_UP_CG_VERTEX(); void SET_UP_CG_FRAGMENT(); void display(); //-------- OpenGLの初期設定 ---------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("Hello Cg with OpenGL"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); } //-------- Cgの初期設定 -----------// void CG_INIT() { //コンテキスト作成 CgContext = cgCreateContext(); if(CgContext == NULL){ std::cerr << "Can't Create Context\n"; exit(0); } SET_UP_CG_VERTEX(); //頂点セットアップ SET_UP_CG_FRAGMENT();//フラグメントセットアップ } //頂点シェーダ設定 void SET_UP_CG_VERTEX() { //プロファイルの設定 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, //プロファイル "Cg_Main", //「.cgファイル」で最初にいく関数 NULL); //NULLでよい cgGLLoadProgram(CgVertexProgram);//プログラムのロード if(CgVertexProgram==NULL){ std::cerr <<"Vertex Program Err. \n"; exit(0); } } //フラグメントシェーダ設定 void SET_UP_CG_FRAGMENT() { //プロファイル 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, //プロファイル "Cg_Fragment_Main", //「.cgファイル」で最初にいく関数 NULL); //NULLでよい cgGLLoadProgram(CgFragmentProgram); //プログラムのロード if(CgFragmentProgram==NULL){ std::cerr <<"Fragment Program Err. \n"; exit(0); } } //---------- メイン関数 ---------------// int main(int argc,char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); CG_INIT();//Cgセットアップ glutMainLoop(); return 0; } //----------- ここから各種コールバック -----------------// void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Cgの有効化 cgGLBindProgram(CgVertexProgram); cgGLEnableProfile(CgVertexProfile); cgGLBindProgram(CgFragmentProgram); cgGLEnableProfile(CgFragmentProfile); glBegin(GL_TRIANGLES); glColor3f(0,1,0); glVertex2f(-0.8, 0.8); glVertex2f(0.8, 0.8); glVertex2f(0.0, -0.8); glEnd(); //Cgの無効化 cgGLDisableProfile(CgVertexProfile); cgGLDisableProfile(CgFragmentProfile); glutSwapBuffers(); }