计算机图形学(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用到的参数类型如下所示。

参数类型

后缀

数据类型

典型的CC++类型

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

 

 

 

posted @ 2013-03-06 15:45  helloj2ee  阅读(4208)  评论(0编辑  收藏  举报