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

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

首先實(shí)現(xiàn) openglglut.h: 以后的所有l(wèi)esson都將包含該頭文件 可能以后的lesson當(dāng)中將會(huì)增加一些函數(shù)的聲明等.

/**//*
** opengl glut框架 定義的頭文件
** 頭文件中聲明了一些主要方法
** 頭文件中實(shí)現(xiàn)一些共同使用的方法則使得不再重復(fù)使用
*/


/**//** 定義避免在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;


/**//** 設(shè)置是否全屏標(biāo)志*/
bool isFullScreen=false;


/**//** glut框架的窗口初始化創(chuàng)建函數(shù)**/

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


/**//** 聲明繪制函數(shù)*/

void glutDisplay(void); /**//** 該函數(shù)由所需要繪制的內(nèi)容單獨(dú)實(shí)現(xiàn)**/


/**//** 聲明窗口調(diào)整函數(shù) **/
void glutResize(int width,int height)


{

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

glMatrixMode(GL_PROJECTION);/**//** 設(shè)置投影矩陣*/
glLoadIdentity(); //設(shè)置當(dāng)前投影矩陣為單位矩陣

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

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


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


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

/**//** 空閑回調(diào)函數(shù)聲明*/
void glutIdle(void);


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


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


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


{
switch (value)

{
case GLUT_KEY_F1: // 按F1鍵時(shí)切換窗口/全屏模式
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
在創(chuàng)建完我的頭文件之后 我將開始了我的opengl學(xué)習(xí)過程
lesson_1:使用glut創(chuàng)建一個(gè)簡單窗口,可實(shí)現(xiàn)按F1 全屏或窗口顯示
#include "openglglut.h"


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


{

/**//** 初始化窗口 并創(chuàng)建窗口*/

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


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


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


/**//** 進(jìn)入仿真循環(huán)*/
glutMainLoop();
}


/**//** 實(shí)現(xiàn)頭文件當(dāng)中定義的繪制函數(shù) **/
void glutDisplay(void)


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

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