原型的杂货铺首页

 
OpenGL编程(1)

 
发表新主题   回复主题    原型的杂货铺首页 -> 软件技术
阅读上一个主题 :: 阅读下一个主题  
作者 正文
klaaa
新手上路


加入时间: 2003/03/15
文章: 8

原币: 25

离线
文章时间: 2003-3-15 周六, 下午10:37    标题: OpenGL编程(1) 引用回复

OpenGL编程(1)

我们来一步步学习使用OpenGL绘制自己的三维场景,我们假设读者具有一定的编程知识和使用VC的经验,并且对于3D术语有基本的了解。
首先,准备环境:VC6和OpenGL库。我说说关于OpenGL库。因为我们的使用环境是Windows,所以使用的最重要的部分就是DLL,我提供一套OpenGL库。其中核心部分是微软实现的opengl32.dll,glu32.dll,为了在VC环境下使用,自然包括opengl32.lib,glu32.lib以及gl.h,glu.h。另外一部分是glut库,glut库不是OpenGL必需的,它的作用是帮助我们快速建立一个基于OpenGL的程序,而不必过于拘泥于Windows程序的结构。在以后的大多数地方,我将使用glut库来演示示例。当然,我也会给出完整的windows程序结构的示例。
首先,我们来做第一个例子,它的功能非常简单,只是画出背景色,它的作用是让我们了解一个基于glut库的OpenGL程序的大致结构。使用VC,创建工程类型Console,引入库opengl32.lib,glu32.lib和glut32.lib,创建一个cpp文件,具体代码如下:

// OpenGL01.cpp
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glut.h>
void RenderScene(void)
{
glClearColor(0,0,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glFinish();
glutSwapBuffers();
}
int main(void)
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutCreateWindow("OpenGL01");
glutDisplayFunc(RenderScene);
glutMainLoop();
return 0;
}

下面,我做一些step-by-step的解释:
在函数main中:
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
这是使用glut库的第一步,初始化。参数GLUT_DOUBLE表示使用双缓冲区,GLUT_RGBA表示使用标准32位颜色。

glutCreateWindow("OpenGL01");
这里使用glut创建一个窗口,我们所有的绘图操作全部在这个窗口完成。参数是创建窗口的标题,这里使用"OpenGL01"。

glutDisplayFunc(RenderScene);
这里设置真正的绘图函数,告诉glut使用函数RenderScene进行绘图操作。参数是绘图函数名称,这里使用RenderScene。

glutMainLoop();
这里,各项设置完成,进入glut的自动化控制,我们不用操心了。由于我们设置绘图函数,所以每次需要绘图的时候,glut就会调用RenderScene来进行绘图操作。

return 0;
最后,退出,返回一个数值0,这不是必需的,但是推荐使用。

在函数RenderScene中:
glClearColor(0,0,1,1);
这是真正的opengl函数,它的作用是设置背景色。四个参数分别表示Red,Green,Blue,Alpha,数值在0到1之间。这里参数0,0,1,1表示Alpha值为1的蓝色。

glClear(GL_COLOR_BUFFER_BIT);
这也是opengl函数,它的作用是清空缓冲区。参数GL_COLOR_BUFFER_BIT表示清空颜色缓冲区,即显示的只有背景色。

glFinish();
这也是一个opengl函数,它的作用强制opengl绘图。由于opengl为了加速绘图操作,往往是等待一大堆命名,然后才开始统一绘制,使用glFinish就是通知opengl不用等待命令了,开始绘制吧。

glutSwapBuffers();
这个函数的作用是在多缓冲区环境下交换缓冲区,使得前后台缓冲区相互交换,从而使得我们的绘图操作得以显示。

建议运行一下写好的程序看看。

下面,再说一些值得注意的地方。
很显然,我们可以从函数名迅速的区分出一个函数是什么类型的函数,例如,所有的opengl函数都是以gl开头,glu函数则是以glu开头,glut以glut开头。不同的函数类型直接和它们的功能有关系。例如,opengl函数做的都是实实在在的绘图操作,glu是一个实用库,提供一些比较高级的操作,glut本身则跟绘图操作基本上没有关系,但是它是一个很好的实用工具集。

好了,第一个例子完成。

klaaa, 2003.03.15.
返回顶端
阅读会员资料 发送站内短信
显示文章:   
发表新主题   回复主题    原型的杂货铺首页 -> 软件技术 所有的时间均为 北京时间
1页,共1

 
论坛转跳:  
不能在本论坛发表新主题
不能在本论坛回复主题
不能在本论坛编辑自己的文章
不能在本论坛删除自己的文章
不能在本论坛发表投票
不能在这个论坛添加附件
可以在这个论坛下载文件


Powered by phpBB 2.0.3 © 2001, 2002 phpBB Group
中文phpBB开发小组提供技术支持