计算机图形学(OpenGL版)-第一个OpenGL程序
获取和安装了OpenGL之后,就可以写第一个OpenGL程序了。虽然Helloj2ee在获取和安装OpenGL非常顺利。但是实际中大家会遇到不同的问题。具体说来主要有以下两个问题。
1、按照上一篇的步骤,VS运行OpenGL程序仍然找不到glut.dll和glut32.dll。这个问题主要是操作系统不一样。64位操作系统,需要将这两个dll安装到系统目录syswow64目录下。
2、lib放置的问题。仍然是部分机器,会存在Program File以及Program Files(x86)目录,您的VS多半会在后一个目录,因此需要找到相应的VS2010安装目录的lib文件夹下。比如Helloj2ee的机器lib的路径是C:\Program Files\Microsoft Visual Studio 10.0\VC\lib,您也可能是C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\lib。
当然Helloj2ee还遇到了同学不知道安装目录到底在哪儿。呃。这Helloj2ee就无能为力,回天乏术了。
一切顺利,您可以开始写第一个OpenGL程序了,程序代码如下图所示。
#include <windows.h> #include <gl/Gl.h> #include <gl/glu.h> #include <gl/glut.h> //<<<<<<<<<<<<<<<<<<<<<<< myInit >>>>>>>>>>>>>>>>>>>> void myInit(void) { glClearColor(0.0, 0.0, 0.0, 0.0); // 设置背景颜色为亮白 glColor3f(1.0f, 1.0f, 1.0f); // 设置绘制颜色为黑 glPointSize(4.0); //设置点的大小为4*4像素 glMatrixMode(GL_PROJECTION);// 设置合适的投影矩阵-以后解释 glLoadIdentity();// 以后解释 gluOrtho2D(0.0, 640.0, 0.0, 480.0);// 以后解释 } //<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>> // 重绘函数 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); // 清屏幕 glBegin(GL_POINTS); glVertex2i(100, 50); // 绘制若干个点 glVertex2i(100, 130); glVertex2i(150, 130); glEnd(); glFlush(); // 将所有输出到显示屏上 } //<<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>> void main(int argc, char **argv) { glutInit(&argc, argv); // 初始化工具包 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显式模式 glutInitWindowSize(640,480); // 设置窗口大小 glutInitWindowPosition(100, 150); // 设置窗口位置 glutCreateWindow("my first attempt"); // 打开屏幕窗口 glutDisplayFunc(myDisplay); // 注册绘制函数 myInit(); glutMainLoop(); // 进入主循环 }
Helloj2ee逐一解释一下。但凡gl开头的函数都是opengl的gl库,glu开头的函数都是glu库,glut开头的函数都是glut库,其他除main外,就是Helloj2ee操刀写的函数。除去亲自操刀写的函数不解释外,其他Helloj2ee都略做解释。
glutInit(int *argcp, char **argv)
该函数初始化工具包,其参数是传送有关命令行信息的标准参数。
glutInitDisplayMode(unsigned int mode)
该函数指明显式屏幕窗口如何被初始化。内置常数GLUT_SINGLE和GLUT_RGB是或的关系,表明应分配单个显式缓存(相对双缓存),而且颜色所需的红、蓝、绿三色的数量来指定。
glutInitWindowSize(int width, int height)
该函数指定显式屏幕窗口的初始尺寸,示例中宽640像素,高480像素。程序运行时,用户可以根据需要调整窗口大小。
glutInitWindowPosition(int x, int y)
该函数指定窗口在屏幕上相对于左上角的位置,示例中距左边100个像素,距顶端150个像素。程序运行时,用户可以根据需要移动窗口。
glutCreateWindow(char* name)
该函数打开并显式屏幕窗口,示例中是将标题设置为了“My First Attempt”。
glutDsiplayFunc(void (*func)(void))
无论系统何时决定重画一个屏幕窗口,它都会发出一个重新绘制事件。出现下列情况之一,就会发生该事件:第一次打开窗口,或覆盖它的窗口被移走而露出该窗口。示例中函数myDisplay()在这里被注册为重新绘制事件的回调函数。
glutMainLoop()
执行这个函数时,程序绘制完初始图形,并进入循环,一直等待事件发生。用鼠标单击关闭窗口按钮,程序正常终止。
glBegin(GLenum mode)和glEnd()
绘制函数应该处于这两个函数之间,示例中GL_POINTS内置于OpenGL中。如果需要绘制点集合、线集合以及多边形,可以传递GL_POINTS,GL_LINES以及GL_POLYGON等。
OpenGl函数命名非常有规则,以glvertex2i为例,gl 代表gl库,Vertex 代表基本命令,2 参数数目,i 参数类型,OpenGL用到的参数类型如下所示。
参数类型
后缀 |
数据类型 |
典型的C或C++类型 |
OpenGL类型名 |
b |
8位整型 |
signed char |
GLbyte |
s |
16位整型 |
short |
GLshort |
i |
32位整型 |
int 或long |
GLint,GLsizei |
f |
32位浮点型 |
Float |
GLfloat,GLclampf |
d |
64位浮点型 |
double |
GLdouble,GLclampd |
ub |
8位无符号整型 |
unsigned char |
GLubyte,GLboolean |
us |
16位无符号整型 |
unsigned short |
GLushort |
ui |
32位无符号整型 |
unsigned int或unsigned long |
GLuint,GLenum,GLbitfield |