最終更新: mikk_ni3_92 2008年11月24日(月) 14:36:14履歴
現在地:メニュー >> サンプルコード::Cg >> Cg::基本編03 >> Cg::基本編03まとめ1
関連:Cg::基本編03まとめ2
関連:Cg::基本編03まとめ2
//-------- 頂点シェーダメイン関数 ---------// void Cg_Main(in float2 PositionIn : POSITION, in float3 ColorIn : COLOR, out float4 PositionOut : POSITION, out float3 ColorOut : COLOR) { PositionOut = float4(PositionIn,0,1); ColorOut = ColorIn; }
//--------- フラグメントシェーダメイン関数 ------------// void Cg_Fragment_Main(in float3 ColorIn : COLOR,out float3 ColorOut:COLOR) { ColorOut = ColorIn; }
#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(); }