opengl 学习 nehe opengl lesson_1

opengl 学习<三> nehe opengl lesson_1

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的代码都将存放在该目录下.
opengl 学习 nehe opengl lesson_1_第1张图片

同样的创建lesson_1.cpp 于是开始我们的代码编写之旅.我觉得良好的编程习惯将带给自己一个很好的工作心情吧.同样的良好的代码风格也将给别人更好的心情..
opengl 学习 nehe opengl lesson_1_第2张图片
首先实现 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();                 //强制绘图命令执行绘制在缓冲区交换出来
}


最终的显示结果将是一个黑色的窗口:
opengl 学习 nehe opengl lesson_1_第3张图片


末尾总结:在这一课当中,我学到如何创建glut窗口 并将它显示出来

你可能感兴趣的:(opengl 学习 nehe opengl lesson_1)