OpenGL基础篇

  • 格式:doc
  • 大小:180.00 KB
  • 文档页数:89

本人水平有限,如有问题请以文章形式提出,大家可以讨论吗... [OPENGL怎么用]OPENGL编程类似C编程,实际接口就是C,所以熟悉C是必要的一般编程可用到的函数库包括:OPENGL实用库:函数以glu开头OPENGL辅助库:函数以aux开头Windows专用函数库:函数以wgl开头Win32API:无专用前缀OPENGL中有115个核心函数,可以在任何OPENGL平台上使用OPENGL实用库比上面这115个函数高一级,提供高级调用OPENGL辅助库本来是提供初学者入门的函数,不保证在任何平台的使用但恰好可以在WIN32下使用,所以本讲座将大量引用WIN32下OPENGL编程有两个方便途径:1使用辅助库2使用C++基于消息驱动的编程显然1要简单一些,入门从这里开始吧。

[用之前的准备]1首先你需要下列*.lib包含在你的工程中:opengl32.lib glu32.lib glaux.lib本讲座所有例子"将"在VC5下调试通过,所以从project->setting->link->general->object/libary modules中加入上面三个*.lib(这些LIB,VC4以上版本已经自带,加入即可,不用在四处搜寻文件)2另外在你的运行程序路径下或\win95\system\下你需要一些*.dll动态连接库opengl32.dll glu32.dll rxddi.dll mga.drv如果谁需要上述文件,跟我打个招呼别跟我说要Visual C++ 5.0 呦[编程入门]这里我将给出一个小例子让大家熟悉用辅助库的编程结构:// GLOS.H//////////////////////////////////////////////////////////// This is an OS specific header file//判别操作系统的基本头文件#include// disable data conversion warnings#pragma warning(disable : 4244) // MIPS#pragma warning(disable : 4136) // X86#pragma warning(disable : 4051) // ALPHA////////////////////////////////////////////////////////////opengl.cpp//主程序#include "glos.h"#include#include#include "windows.h"void main(void){/*初始化:*/auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式auxInitPosition(0,0,500,500);//大小x=500 y=500 (0,0)是屏幕左上点auxInitWindow("sample1");//窗口初始化,参数是标题glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色//即背景色/*绘图*/glColor3f(1.0,0.0,0.0);//选颜色(R,G,B),参数0<XglRectf(-0.5,-0.5,0.5,0.5);//画个方块glFlush();//强制绘图,不驻留缓存_sleep(1000);//windows函数,显示1秒(单位是毫秒)}//end of sample根据注释,应该看出程序功能:显示红色方块(2D)一秒钟。

主程序结构不外乎:初始化+ 绘图+ 其它功能调用,现在不用过分追究函数细节,知道是干什么的就可以乐,好吗?我想结束本节前让大家实现第一个3D的例子,很简单而且好看的,但是我们必须被迫不得不多学些东东:1.OPENGL函数、变量命名准则变量:前缀类型对应C变量b 8-bit int signed chars 16-bit int shorti 32-bit int longf 32-bit float floatd 64-bit float doubleub 8-bit unsigned int unsigned charus 16-bit unsigned int unsigned shortui 32-bit unsigned int unsigned long例如1.0f实际就是1.0,一般写成1.0f看上去好辨认一些。

函数:函数参数类型作为函数后缀例如:glVertex2i(2,4)表明是opengl基本函数(gl-)是绘点的函数(-Vertex-)是两个整型参数(-2i)将来对一个函数掐头去尾就知道它是干什么的乐。

2.CALLBACK函数是一些用来让系统调用的函数,系统要调用它们,例如显示、接受键盘输入...你就好比擂积木一样把它们列在主程序初始化后(顺序一般无关紧要),系统会自动执行它们,例如:void CALLBACK display(void)中你写好乐想画什么东东,然后主程序中使用auxMainLoop (display);就可以让这个东东一直显示乐,很类似VC中的OnPaint()3.OPENGL基本库的绘图方法glBegin(类型);glColor3f(...);glVertex(...)glColor3f(...);glVertex(...);...glEnd();先由"类型"指定画什么平面:GL_POINTS 单个顶点集GL_LINES 多组线,2个点一条线GL_GL_POLYGON 单个简单填充凸多边形GL_TRAINGLES 多组三角型,3个点一个三角..用到在说吧(自己可以在VC HELP INDEX中查找)////////////////////////////////////////////////////////sample.cpp#include "glos.h"#include#include#include "windows.h"void myinit(void);void CALLBACK display(void);void CALLBACK reshape(GLsizei w,GLsizei h);//这里不用管reshape(),只是一个用于窗口改变大小时的处理//与绘图无关,后面会讲到//这里的重点是display(),请注意绘图的方法void myinit(void){/*初始化:*/auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式auxInitPosition(0,0,500,500);//大小x=500 y=500 (0,0)是屏幕左上点auxInitWindow("sample1");//窗口初始化,参数是标题glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色//即背景色}void CALLBACK reshape(GLsizei w,GLsizei h){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w,20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0);elseglOrtho(-20.0*(GLfloat)h/(GLfloat)w,20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void CALLBACK display(void){glBegin(GL_TRIANGLE_STRIP);//画连续填充的多个三角glColor3f(1.0,0.0,0.0);glVertex3f(15.0,0.0,0.0);glColor3f(0.0,1.0,0.0);glVertex3f(-15.0,0.0,0.0);glColor3f(0.0,0.0,1.0);glVertex3f(0.0,15.0,15.0);//第一个三角glColor3f(0.0,1.0,1.0);glVertex3f(10.0,15.0,-15.0);//第二个三角glColor3f(1.0,1.0,0.0);glVertex3f(15.0,0.0,0.0);//第三个三角glEnd();glFlush();}void main(void){myinit();auxReshapeFunc(reshape);auxMainLoop(display);}//end of sample所谓连续填充就是1、2、3点组成三角12、3、4点组成三角2...这里一共画乐3个向连接的彩色三角,组成乐一个由三个彩色平面围成的空心三角椎...enjo y it上回书说道有个reshape需要进一步讲解这个函数功能是对用户改变窗口大小的操作进行一些重绘的动作(类似VC中的OnResize)。

其中用到了一些变换的概念我希望大家已经具备初步的计算机图形学的知识,这将有利于这部分的理解。

如果还没有,也没关系,我尽量讲解的通俗一些对于3D绘图,把其中3D坐标写成齐次坐标系后,是4*4的矩阵形式(详细…………………………………………………………可以参阅相关文献,后面也会讲到。

)任何投影、旋转...操作都可以看成是矩阵相乘的操作。

矩阵操作----这个概念一定要形成!!例如在2D中普通的旋转变换,可以写成:|cosθ sinθ 0 |[x" y" 1]=[x y 1] |-sinθ cosθ 0 ||0 0 1 |3D中道理完全一样,一个3D图形的显示包括下面步骤:1.视点变换(将相机放在合适的地方对准3D景物)2.模型变换(将3D物体放在合适的地方)3.投影变换(将相机镜头调整,使3D景物投影在2D胶片上)4.视口变换(决定胶片大小)其中1、2并没有本质区别。