随笔-38  评论-23  文章-0  trackbacks-0

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(
00, width, height);/** 设置视口*/
    glMatrixMode(GL_PROJECTION);
/** 设置投影矩阵*/
    glLoadIdentity();  
//设置当前投影矩阵为单位矩阵
    /* modify this line to change perspective values */
    
/*使用透视投影,这其实是定义了一个投影矩阵并右乘当前矩阵得到最终投影矩阵*/
    gluPerspective(
45.0, (float)width/(float)height, 1.0300.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 米游 阅读(737) 评论(0)  编辑 收藏 引用 所属分类: OpenGL/OSG

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理