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
米游 阅读(737)
评论(0) 编辑 收藏 引用 所属分类:
OpenGL/OSG