0001: // ----------------------------------------------------------------------------
0002: //
0003: // main.cpp - GLUT のサンプルソース
0004: // 
0005: // Copyright (c) 2002 今給黎 隆 (imagire@nify.com)
0006: // All Rights Reserved.
0007: //
0008: // ----------------------------------------------------------------------------
0009: 
0010: #include <GL/glut.h>
0011: #include <Cg/cg.h>
0012: #include <Cg/cgGL.h>
0013: #include <assert.h>
0014: #include "CBitmap.h"
0015: 
0016: //テクスチャ
0017: unsigned int tex;
0018: 
0019: // Cg のオブジェクト
0020: static cgContext        *CgContext              = NULL;
0021: static cgProgramIter    *FragmentProgramIter    = NULL;
0022: static cgBindIter       *MapBind            = NULL;
0023: 
0024: // ---------------------------------------------------------------------------
0025: // 画面描画
0026: // ---------------------------------------------------------------------------
0027: static void draw_polygone()
0028: {
0029:     glBegin(GL_TRIANGLE_STRIP);     // ストリップ設定
0030:         glTexCoord2f(1.0, 0.0);
0031:         glVertex3f(-0.4, +0.8, 0.0f);
0032: 
0033:         glTexCoord2f(0.0, 0.0);
0034:         glVertex3f( 0.4, +0.8, 0.0f);
0035:         
0036:         glTexCoord2f(1.0, 1.0);
0037:         glVertex3f(-0.4, -0.8, 0.0f);
0038:         
0039:         glTexCoord2f(0.0, 1.0);
0040:         glVertex3f( 0.4, -0.8, 0.0f);
0041:     glEnd();                        // ポリゴンの描画終了
0042: }
0043: // ---------------------------------------------------------------------------
0044: // 画面描画
0045: // ---------------------------------------------------------------------------
0046: void display(void)
0047: {
0048:     cgError Ret;
0049: 
0050:     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
0051: 
0052:     // ビュー行列の設定
0053:     glMatrixMode(GL_MODELVIEW);
0054:     glLoadIdentity();
0055:     gluLookAt(  0.0, 0.0, 1.0,      // 視点
0056:                 0.0, 0.0, 0.0,      // 注目点
0057:                 0.0, 1.0, 0.0);     // 上方向
0058: 
0059:     // テクスチャの使用
0060:     cgGLActiveTexture(MapBind);
0061:     glEnable(GL_TEXTURE_2D);
0062:     glBindTexture(GL_TEXTURE_2D, tex);
0063: 
0064:     glPushMatrix();                 // ビュー行列が他のポリゴンでも使えるよう退避
0065:     glTranslatef(-0.5, 0.0, 0.0);   // 左に移動
0066:     draw_polygone();                // ポリゴン描画
0067:     glPopMatrix();                  // ビュー行列に現在の行列を戻す
0068: 
0069:     Ret = cgGLBindProgram(FragmentProgramIter);
0070:     assert(Ret == cgNoError);
0071:     cgGLEnableProgramType(cgFragmentProfile);
0072: 
0073:     glPushMatrix();                 // ビュー行列が他のポリゴンでも使えるよう退避
0074:     glTranslatef(+0.5, 0.0, 0.0);   // 右に移動
0075:     draw_polygone();                // ポリゴン描画
0076:     glPopMatrix();                  // ビュー行列に現在の行列を戻す
0077: 
0078:     // テクスチャの使わないよ
0079:     cgGLActiveTexture(MapBind);
0080:     glDisable(GL_TEXTURE_2D);
0081:     // シェーダの無効化
0082:     cgGLDisableProgramType(cgFragmentProfile);
0083: 
0084:     glutSwapBuffers();              // 画面の更新の終了
0085: }
0086: // ---------------------------------------------------------------------------
0087: // 画面がリサイズされたとき
0088: // ---------------------------------------------------------------------------
0089: void resize(int w, int h)
0090: {
0091:     // ビューポートの設定
0092:     glViewport(0, 0, w, h);
0093: 
0094:     // 射影行列の設定
0095:     glMatrixMode(GL_PROJECTION);
0096:     glLoadIdentity();
0097:     glOrtho(-1,1,-1,1,0.1,10);
0098: //      90.0,           // 画角
0099: //                  1.0,            // アスペクト比
0100: //                  0.1, 10.0);     // 前方面、後方面
0101: }
0102: // ---------------------------------------------------------------------------
0103: // ひまなときに実行される
0104: // ---------------------------------------------------------------------------
0105: void idle()
0106: {
0107:     glutPostRedisplay();            // 再描画リクエスト
0108: }
0109: // ---------------------------------------------------------------------------
0110: // Cgの初期化
0111: // ---------------------------------------------------------------------------
0112: static void InitializeCg()
0113: {
0114:     cgError Ret;
0115:     
0116:     // Cg の作成
0117:     CgContext = cgCreateContext();
0118:     assert(CgContext != NULL);
0119: 
0120:     // フラグメントプログラム
0121:     Ret = cgAddProgramFromFile(CgContext, "fp.cg", cgFragmentProfile, NULL);
0122:     assert(Ret == cgNoError);
0123: 
0124:     // プログラム名でプログラムを結びつける
0125:     FragmentProgramIter = cgProgramByName(CgContext, "main");
0126:     assert(FragmentProgramIter != NULL);
0127: 
0128: #if 1
0129:     // ソースの表示
0130:     fprintf(stderr, "---- プログラム はじめ ----\n"
0131:                     "%s"
0132:                     "---- プログラム 終わり ----\n",
0133:     cgGetProgramObjectCode(FragmentProgramIter));
0134: #endif
0135:     if(FragmentProgramIter != NULL) {
0136:         GLuint ProgId = 1;
0137: 
0138:         Ret = cgGLLoadProgram(FragmentProgramIter, ProgId);
0139:         assert(Ret == cgNoError);
0140: 
0141:         MapBind     = cgGetBindByName(FragmentProgramIter, "SrcMap");
0142:         assert(MapBind != NULL);
0143:     }
0144:     
0145: }
0146: // ---------------------------------------------------------------------------
0147: // メイン関数
0148: // ---------------------------------------------------------------------------
0149: int main(int argc, char *argv[])
0150: {
0151:     // ウィンドウの作成
0152:     glutInitWindowPosition(100, 100);   // 表示位置
0153:     glutInitWindowSize(640, 320);       // サイズ
0154:     glutInit(&argc, argv);              // GLの初期化
0155:     glutInitDisplayMode(GLUT_DOUBLE     // 描画モード
0156:                      | GLUT_RGBA        // wバッファ+RGBA+深度バッファ
0157:                      | GLUT_DEPTH);
0158:     glutCreateWindow("Iris filter");            // ウィンドウの生成
0159:     
0160:     // コールバック関数の設定
0161:     glutDisplayFunc(display);           // 描画関数
0162:     glutReshapeFunc(resize);    // 画面が変形したとき
0163:     glutIdleFunc(idle);         // ひまなとき
0164:     
0165:     // Cg の初期化
0166:     InitializeCg();
0167: 
0168:     //テクスチャの生成
0169:     tex = CBitmap::Load("hinode.bmp");
0170:     glBindTexture(GL_TEXTURE_2D, tex);
0171:     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
0172:     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
0173:     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
0174:     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
0175:     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
0176: 
0177:     // 一度だけすればいい設定
0178:     glClearColor(0.0, 0.0, 0.3, 0.0);   // 背景色の設定
0179:     glEnable(GL_DEPTH_TEST);            // 深度バッファの使用
0180: 
0181:     glutMainLoop();                     // メインループ
0182: 
0183:     if( MapBind )cgFreeBindIter( MapBind );
0184:     cgFreeProgramIter( FragmentProgramIter );
0185:     cgFreeContext( CgContext );
0186:     cgCleanup( );
0187: 
0188:     return 0;
0189: }