#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();
}