nehe opengl 教程的使用的框架是基于win32的編程.雖然教程的作者已經搭好框架了,但是相對于來講win32窗口的編程是比較麻煩的,鑒于此,身為opengl初學者的我,在使用編程的習慣還是傾向于使用簡單的glut實用庫來重寫自己想學的所有lession.為此所有的lession 我將集中于一個大工程里.通過同一個頭文件定義所有的聲明等.
我為什么這么做呢?因為若我想用oop實現它 這將會是將簡單且容易轉換的.
現在將開始我的opengl之旅...基于vs 2008創建一個總體工程框架.
首先 新建 一個vs2008 解決方案 (solution) 命名為 opengl_glut 創建項目名稱定為lesson_1 設置為空白項目
在項目 lesson_1中添加頭文件 openglglut.h 將其保存在 opengl_glut解決方案下的src目錄,這個目錄將保存所有的源代碼,以后所有的lesson的代碼都將存放在該目錄下.

同樣的創建lesson_1.cpp 于是開始我們的代碼編寫之旅.我覺得良好的編程習慣將帶給自己一個很好的工作心情吧.同樣的良好的代碼風格也將給別人更好的心情..

首先實現 openglglut.h: 以后的所有lesson都將包含該頭文件 可能以后的lesson當中將會增加一些函數的聲明等.

/**//*
** opengl glut框架 定義的頭文件
** 頭文件中聲明了一些主要方法
** 頭文件中實現一些共同使用的方法則使得不再重復使用
*/


/**//** 定義避免在glut使用atexit*/
#ifndef GLUT_DISABLE_ATEXIT_HACK
#define GLUT_DISABLE_ATEXIT_HACK
#endif

#ifdef WIN32
#include<windows.h>
#endif

#ifndef OPENGLGLUT_H
#define OPENGLGLUT_H

#include<stdio.h>
#include<stdlib.h>
#include<gl\glut.h>

/**//** 初始化一些窗口變量值*/
const int GL_WIN_WIDTH = 640;
const int GL_WIN_HEIGHT = 480;
const int GL_WIN_INITIAL_X = 30;
const int GL_WIN_INITIAL_Y = 30;


/**//** 設置是否全屏標志*/
bool isFullScreen=false;


/**//** glut框架的窗口初始化創建函數**/

void createWindow(char* title,int* argc,char** argv)


{
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA | GLUT_MULTISAMPLE );
glutInitWindowPosition( GL_WIN_INITIAL_X, GL_WIN_INITIAL_Y );
glutInitWindowSize( GL_WIN_WIDTH, GL_WIN_HEIGHT );
glutInit(argc, argv);
glutCreateWindow(title);
}


/**//** 聲明繪制函數*/

void glutDisplay(void); /**//** 該函數由所需要繪制的內容單獨實現**/


/**//** 聲明窗口調整函數 **/
void glutResize(int width,int height)


{

glViewport(0, 0, width, height);/**//** 設置視口*/

glMatrixMode(GL_PROJECTION);/**//** 設置投影矩陣*/
glLoadIdentity(); //設置當前投影矩陣為單位矩陣

/**//* modify this line to change perspective values */

/**//*使用透視投影,這其實是定義了一個投影矩陣并右乘當前矩陣得到最終投影矩陣*/
gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);
glMatrixMode(GL_MODELVIEW); //設置模型視圖矩陣
glLoadIdentity(); //設置當前矩陣為單位矩陣
}


/**//** 聲明opengl初始化*/
void InitOpenGL(void)


{
glShadeModel(GL_SMOOTH); //啟用陰影平滑
glClearColor(0.0,0.0,0.0,0.0); //黑色背景
glClearDepth(1.0f); // 設置深度緩存
glEnable(GL_DEPTH_TEST); // 啟用深度測試
glDepthFunc(GL_LEQUAL); // 所作深度測試的類型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //告訴系統 對透視進行修正
}

/**//** 空閑回調函數聲明*/
void glutIdle(void);


/**//** glut鼠標控制函數聲明*/
void glutMouse(int button,int state,int x,int y);


/**//** glut鍵盤控制函數聲明*/
void glutKeyboard(unsigned char key,int x,int y);


/**//** 聲明glut特殊按鍵 如shit ctrl alt等處理函數*/
void glutSpecial(int value, int x, int y)


{
switch (value)

{
case GLUT_KEY_F1: // 按F1鍵時切換窗口/全屏模式
if(isFullScreen)

{
glutReshapeWindow(GL_WIN_WIDTH, GL_WIN_HEIGHT);
glutPositionWindow(GL_WIN_INITIAL_X, GL_WIN_INITIAL_Y);
isFullScreen = false;
}
else

{
glutFullScreen();
isFullScreen = true;
}
return;
default:
return;
}
}

#endif
在創建完我的頭文件之后 我將開始了我的opengl學習過程
lesson_1:使用glut創建一個簡單窗口,可實現按F1 全屏或窗口顯示
#include "openglglut.h"


/**//*
** opengl 教程第一課內容
** 創建一個簡單的glut窗口流程
*/
int main(int argc, char** argv)


{

/**//** 初始化窗口 并創建窗口*/

createWindow("opengl lesson_1",&argc,argv);


/**//** 注冊glut的一些函數*/
glutReshapeFunc(glutResize); //窗口調整函數 使得調整后圖形顯示不發生改變
glutDisplayFunc(glutDisplay); //重繪函數 使得可以在窗口中繪制圖形
glutSpecialFunc(glutSpecial); //特殊按鍵函數 使得實現全屏/窗口切換


/**//** 初始化opengl的一些操作*/
InitOpenGL();


/**//** 進入仿真循環*/
glutMainLoop();
}


/**//** 實現頭文件當中定義的繪制函數 **/
void glutDisplay(void)


{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //將先初始化單位矩陣
glutSwapBuffers(); //強制繪圖命令執行繪制在緩沖區交換出來
}
最終的顯示結果將是一個黑色的窗口:

末尾總結:在這一課當中,我學到如何創建glut窗口 并將它顯示出來
posted on 2009-07-15 09:28
米游 閱讀(760)
評論(0) 編輯 收藏 引用 所屬分類:
OpenGL/OSG