glBegin()用法小结

合集下载

OpenGL编程低级错误及常见问题解答

OpenGL编程低级错误及常见问题解答

OpenGL编程低级错误及常见问题解答低级错误1.没有glDisable(GL_TEXTURE_2D),导致基本几何作图全部失败。

2.镜头位置没调好,导致所有物体不可见.3.物体位置数据错误,导致物体大大超出镜头显示范围.4.纹理没有GL_CLAMP导致边界拼接出现缝线.5.纹理没有GL_REPEA T导致使用超出1.0纹理坐标技巧失败,显示单色插值.6.没有glEnable(GL_TEXTURE_2D)导致全白纹理.7.glEnable(GL_TEXTURE_2D)后没有使用纹理顶点导致如glColor效果的纯单色.8.应该在作图循环设置灯光位置,因为The?position?is?transformed?by?the?modelview?matrix?when?glLight?is?called?(just?as?if?it?w ere?a?point),?and?it?is?stored?in?eye?coordinates.?9.灯光位置应该是4个float,3个float程序不出错,但结果完全扭曲。

10.打开灯光却没设置顶点法线,到头一场空。

11.Window Class 没有CS_OWNDC,导致glDrawPixels失败,如在子窗口V iew上进行象素写入操作.12.没有设置PIXELFORMA TDESCRIPTOR的cAlphaBits=8,导致glReadPixels读取alpha通道数据失败,统统为0.13.手动实现的多层纹理闪烁,出现线带,没有使用glPolygonOffset.14.glDrawPixels格式GL_RGB或GL_BGR_EXT的数据时崩溃,且数据有效,没有使用glPixelStorei(GL_UNPACK_ALIGNMENT, 1);导致图像行默认4字节对齐,导致OpenGL数据读取越界崩溃.相应的要为glReadPixels设置glPixelStorei(GL_PACK_ALIGNMENT, 1); 15.glReadPixel读取被覆盖的OpenGL窗口部分的图像数据时,读出数据混乱无效,OpenGL Pixel Ownership检测导致,标准如此.使用PixelBuffer,或强制置前OpenGL窗口解决.16.glReadPixels读取总是从FrameBuffer的左下往右上读取,毫无参数可设置改变方向,真是笨到家了. 载入图像一般还是从上到下比较容易理解.17.使用glDepthMask(GL_FALSE)后不打开,glClear无法清除深度缓冲,导致现象:场景起始静止正常,一旦移动出现不规则的透明无渲染区域,深度缓存逻辑混乱.18.gluPerspective(45.0f, (GLfloat)cxPixels/(GLfloat)cyPixels, 0.1f, 2000.0f);这里的0.1f将导致物体和地面的相交处闪烁,原因待查,至少取1.0f.19.没有显示定义shiniess或shiniess为0,在shader中对gl_FrontMaterial.shininess使用pow 计算,结果不可测,黑色条带闪烁,quite not understand.常见错误问:OpenGL中的Stencil Buffer是什么东西?答:模板缓存(Stencil Buffer)。

OpenGL使用手册.

OpenGL使用手册.

OpenGL函数使用手册(一)OpenGL函数库格式:<库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl、glu、aux、glut、wgl、glx、agl 等等,1,核心函数库主要可以分为以下几类函数:(1) 绘制基本的几何图元函数。

如:glBegain().(2) 矩阵操作、几何变换和投影变换的函数。

如:矩阵入栈glPushMatrix(),还有矩阵的出栈、转载、相乘,此外还有几何变换函数glTranslate*(),投影变换函数glOrtho()和视口变换函数glViewport()等等。

(3) 颜色、光照和材质函数。

(4) 显示列表函数,主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、glEndList()、glGenLists()、glDeleteLists()和glCallList()。

(5) 纹理映射函数,主要有一维和二维纹理函数,设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、glTexEnv*()和glTetCoord*()等。

(6) 特殊效果函数。

(7) 选着和反馈函数。

(8) 曲线与曲面的绘制函数。

(9) 状态设置与查询函数。

(10) 光栅化、像素函数。

2,OpenGL实用库(The OpenGL Utility Library)(GLU)包含有43个函数,函数名的前缀名为glu.(1) 辅助纹理贴图函数。

(2) 坐标转换和投影变换函数。

(3) 多边形镶嵌工具。

(4) 二次曲面绘制工具。

(5) 非均匀有理B样条绘制工具。

(6) 错误反馈工具,获取出错信息的字符串gluErrorString() 3,OpenGL辅助库包含有31个函数,函数名前缀名为aux这部分函数提供窗口管理、输入输出处理以及绘制一些简单的三维物体。

4,OpenGL工具库(OpenGL Utility Toolkit)包含大约30多个函数,函数前缀名为glut,此函数由glut.dll来负责解释执行。

OpenGL入门学习——写给想用计算机画图的朋友

OpenGL入门学习——写给想用计算机画图的朋友

第一课说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧?但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。

本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。

1、与C语言紧密结合。

OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL 是容易理解和学习的。

如果你曾经接触过TC的,你会发现,使用OpenGL作图甚至比TC 更加简单。

2、强大的可移植性。

微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。

而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。

并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。

3、高性能的图形渲染。

OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。

总之,OpenGL是一个很NB的图形软件接口。

至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。

OpenGL官方网站(英文)下面我将对Windows下的OpenGL编程进行简单介绍。

学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。

但这里我们选择Visual Studio 2005作为学习OpenGL的环境。

第二步,安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。

opengl教程c语言版

opengl教程c语言版

OpenGL教程(c语言)1.第一课:说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧?但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。

本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。

OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。

1、与C语言紧密结合。

OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。

如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。

2、强大的可移植性。

微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。

而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。

并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。

3、高性能的图形渲染。

OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。

总之,OpenGL是一个很NB的图形软件接口。

至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。

OpenGL官方网站(英文)下面我将对Windows下的OpenGL编程进行简单介绍。

学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。

但这里我们选择Visual Studio 2005作为学习OpenGL的环境。

opengl绘制教室大作业源代码wp

opengl绘制教室大作业源代码wp

wp.h#include <windows.h>// Windows的头文件#include <glut.h>// 包含OpenGL实用库#include<stdio.h>// 标准输入/输出库的头文件#include<glaux.h>// GLaux库的头文件#include<math.h>#include <stdlib.h>#include <time.h>#include <iostream.h>//..................................定义变量区............................................................////.............................用于场景漫游有关变量........................................//GLfloat xrot=0.0f;// X 旋转量GLfloat yrot=0.0f;// Y 旋转量GLfloat x=0.0f;// X 平移量GLfloat y=0.0f;// Y 平移量GLfloat z=-40.0f;// 深入屏幕的距离//.............................用于键盘操作有关变量.......................................//BOOL light=TRUE;// 光源的开/关BOOL lp;// L键按下了么?BOOL fp;// F键按下了么?BOOL TurnOn=FALSE; // 开灯GLUquadricObj *qobj;int fantheta=0; // 风扇转过角度HGLRC hRC=NULL;// 窗口着色描述表句柄HDC hDC=NULL;// OpenGL渲染描述表句柄HWND hWnd=NULL;// 保存我们的窗口句柄HINSTANCE hInstance;// 保存程序的实例bool keys[256];// 保存键盘按键的数组bool active=TRUE;// 窗口的活动标志,缺省为TRUEbool fullscreen=TRUE;// 全屏标志缺省,缺省设定成全屏模式//.................................光照材质有关变量......................................//GLfloat light_Ambient[]= { 0.1f, 0.1f, 0.1f, 1.0f }; // 环境光参数GLfloat light_Diffuse[]= { 1.0f, 1.0f, 0.45f, 1.0f };// 漫射光参数GLfloat light_position[]={0.0,29.9,0.0,1.0}; // 光源位置GLfloat light_position1[]={20.0,29.9,0.0,1.0};GLfloat mat_ambient[]={0.05f,0.05f,0.05f,1.0f}; // 材质环境光参数GLfloat mat_specular[]={0.8,1.0,1.0,1.0}; // 材质镜面光参数GLfloat mat_shininess[]={5.0};GLfloat white_light[]={1.0,1.0,1.0,1.0}; // 光GLfloat no_mat[]= {0.0f, 0.0f, 0.0f, 1.0f};// 无材质色GLfloat no_shininess[]= {0.0f};// 无反光GLfloat mat_diffuse[]= {1.0f, 1.0f, 1.0f, 1.0f};// 漫反射GLfloat diffusion[]={0.521f,0.121f,0.0547f,1.0};//......................................纹理...........................................................//GLuint texture[6];// 7种纹理的储存空间//.....................................时钟有关变量...................................................//GLfloat cx=35.0,cy=15.0,cz=-79.9,radius=5.0;GLfloat hradius=2.0,mradius=3.0,sradius=4.0;GLfloat sangle,mangle,hangle;GLuint second,miniter,hour;char timebuffer[9];LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// WndProc的定义wp.cpp#include"wp.h"//......................................创建纹理..........................................................//AUX_RGBImageRec *LoadBMP(char *)// 载入位图图象{FILE *;// 文件句柄if (!)// 确保文件名已提供{return NULL;// 如果没提供,返回NULL}(,"r");// 尝试打开文件if (File)// 文件存在么?{fclose(File);// 关闭句柄return auxDIBImageLoad();// 载入位图并返回指针}return NULL;}// 如果载入失败,返回NULLint LoadGLTextures()// 载入位图并转换成纹理{int Status=FALSE;// 状态指示器AUX_RGBImageRec *TextureImage[6];// 创建纹理的存储空间memset(TextureImage,0,sizeof(void *)*1);// 将指针设为NULL// 载入位图,检查有无错误,如果位图没找到则退出Status=TRUE;// 将Status 设为TRUE//...............................创建第一个纹理,地板.......................................//if (TextureImage[0]=LoadBMP("floor.bmp")){glGenTextures(1, &texture[0]);// 创建纹理glBindTexture(GL_TEXTURE_2D, texture[0]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);//绑定纹理}if (TextureImage[0])//纹理是否存在{if (TextureImage[0]->data)//纹理图像是否存在{free(TextureImage[0]->data);//释放纹理图像占用的内存}free(TextureImage[0]);//释放图像结构}//...............................创建第二个纹理,墙.......................................//if (TextureImage[1]=LoadBMP("wall.bmp"))glGenTextures(1, &texture[1]); //创建纹理glBindTexture(GL_TEXTURE_2D, texture[1]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data);//绑定纹理}if (TextureImage[1])//纹理是否存在{if (TextureImage[1]->data)//纹理图像是否存在{free(TextureImage[1]->data);//释放纹理图像占用的内存}free(TextureImage[1]);//释放图像结构}//...............................创建第三个纹理,窗户.......................................//if (TextureImage[2]=LoadBMP("glass.bmp")){glGenTextures(1, &texture[2]);//创建纹理glBindTexture(GL_TEXTURE_2D, texture[2]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[2]->sizeX, TextureImage[2]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[2]->data);//绑定纹理}if (TextureImage[2])//纹理是否存在{if (TextureImage[2]->data)//纹理图像是否存在{free(TextureImage[2]->data);//释放纹理图像占用的内存}free(TextureImage[2]);//释放图像结构}//...............................创建第四个纹理,门.......................................//if (TextureImage[3]=LoadBMP("door.bmp"))glGenTextures(1, &texture[3]);//创建纹理glBindTexture(GL_TEXTURE_2D, texture[3]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[3]->sizeX, TextureImage[3]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[3]->data);//绑定纹理}if (TextureImage[3])//纹理是否存在{if (TextureImage[3]->data)//纹理图像是否存在{free(TextureImage[3]->data);//释放纹理图像占用的内存}free(TextureImage[3]);//释放图像结构}//...............................创建第五个纹理,灯.......................................//if (TextureImage[4]=LoadBMP("lamp.bmp")){Status=TRUE;glGenTextures(1, &texture[4]);//创建纹理glBindTexture(GL_TEXTURE_2D, texture[4]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[4]->sizeX, TextureImage[4]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[4]->data);//绑定纹理}if (TextureImage[4])//纹理是否存在{if (TextureImage[4]->data)//纹理图像是否存在{free(TextureImage[4]->data);//释放纹理图像占用的内存}free(TextureImage[4]);//释放图像结构}//...............................创建第六个纹理,黑板.......................................//if (TextureImage[5]=LoadBMP("blackwall.bmp")){glGenTextures(1, &texture[5]);//创建纹理glBindTexture(GL_TEXTURE_2D, texture[5]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[5]->sizeX, TextureImage[5]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[5]->data);//绑定纹理}if (TextureImage[5])//纹理是否存在{if (TextureImage[5]->data)//纹理图像是否存在{free(TextureImage[5]->data);//释放纹理图像占用的内存}free(TextureImage[5]);//释放图像结构}return Status;}//...................................重置OpenGL窗口大小..............................................//GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// 重置OpenGL窗口大小{if (height==0)// 防止被零除{height=1;// 将Height设为1 }glViewport(0, 0, width, height);// 重置当前的视口glMatrixMode(GL_PROJECTION);// 选择投影矩阵glLoadIdentity();// 重置投影矩阵// 设置视口的大小gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,1000.0f);glMatrixMode(GL_MODELVIEW);// 选择模型观察矩阵glLoadIdentity();// 重置模型观察矩阵}//...................................初始化操作................................................//int InitGL(GLvoid)// 此处开始对OpenGL进行所有设置{if (!LoadGLTextures())// 调用纹理载入子例程{return FALSE;// 如果未能载入,返回FALSE}glEnable(GL_TEXTURE_2D);// 启用纹理映射glShadeModel(GL_SMOOTH);// 启用阴影平滑glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 黑色背景glClearDepth(1.0f);// 设置深度缓存glEnable(GL_DEPTH_TEST);// 启用深度测试glDepthFunc(GL_LEQUAL);// 所作深度测试的类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// 告诉系统对透视进行修正glLightModelfv(GL_LIGHT_MODEL_AMBIENT,mat_ambient);glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT1,GL_POSITION,light_position); // 设置光源位置glLightfv(GL_LIGHT1,GL_AMBIENT,light_Ambient); // 设置环境光glLightfv(GL_LIGHT1,GL_DIFFUSE,white_light); // 设置漫射光glLightfv(GL_LIGHT1,GL_SPECULAR,white_light);glEnable(GL_LIGHTING);glEnable(GL_LIGHT1);// 启用一号光源glEnable(GL_COLOR_MATERIAL);glPixelStorei(GL_UNPACK_ALIGNMENT,1); //对齐像素字节函数return TRUE;// 初始化OK}//..............................................开始绘制..........................................//int DrawGLScene(GLvoid)// 从这里开始进行所有的绘制{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存glLoadIdentity();// 重置当前的模型观察矩阵glTranslatef(x,y,z); //沿X,Y,Z轴移动glRotatef(xrot,1.0f,0.0f,0.0f);// 绕X轴旋转glRotatef(yrot,0.0f,1.0f,0.0f);// 绕Y轴旋转glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); //选择材质光照glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);//.............................................房间........................................................////.............................................地板........................................................//glBindTexture(GL_TEXTURE_2D, texture[0]);// 选择纹理glBegin(GL_QUADS); //开始绘制四边形glColor3f(1.0f, 1.0f, 1.0f);glNormal3f(0.0,1.0,0.0); //glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, -21.0f, -80.0f);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);//左下glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, -21.0f, -80.0f);//左上glEnd();//.............................................天花板......................................................//glBindTexture(GL_TEXTURE_2D, texture[1]);// 选择纹理glBegin(GL_QUADS);//开始绘制四边形glColor3f(1.0f, 1.0f, 1.0f);glNormal3f(0.0f, -1.0f, 0.0f);//glNormal3f用于定义点的法向量glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, 30.0f, 40.0f);//左下glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);//左上glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, 30.0f, 40.0f);//右下glEnd();//............................................后墙面.......................................................//glBegin(GL_QUADS);//开始绘制四边形glColor3f(1.0f, 1.0f, 1.0f);glNormal3f(0.0f, 0.0f, 1.0f);//glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, -80.0f);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, -80.0f);//左下glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);//左上//............................................前墙面.......................................................//glNormal3f(0.0f, 0.0f, -1.0f);//glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, 40.0f);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);//左下glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, 40.0f);//左上//............................................左墙面.......................................................//glNormal3f( 1.0f, 0.0f, 0.0f);//glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, 30.0f, 40.0f);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, -21.0f, -80.0f);//左下glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);//左上//............................................右墙面.......................................................//glNormal3f(-1.0f, 0.0f, 0.0f);//glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, -21.0f, -80.0f);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);//左下glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, 30.0f, 40.0f);//左上glEnd();//.............................................桌椅..........................................................//GLuint i=0;for(;i<5;i++)//一共五排桌椅{//............................................第一张桌椅......................................................////..........................桌子的上面.......................//glPushMatrix();//因为下面要对坐标进行变换,所以先将信息入栈保护,使整个工程的坐标不发生改变glColor3f(1.0,1.0,0.45);glTranslatef(30.0f,-10.0f,-30.0+i*9);//平移变换glScalef(13.0f,0.3f,5.0f);//缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//..........................桌子的下面......................//glPushMatrix();//压入堆栈glColor3f(1.0,1.0,0.45);glTranslatef(30.0f,-13.0f,-30.0+i*9);//平移变换glScalef(11.0f,0.3f,5.0f);//缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//...........................桌子的后面......................//glPushMatrix();//压入堆栈glColor3f(0.2,0.8,0.8);glTranslatef(30.0f,-12.0f,-32.5f+i*9);//平移变换glScalef(11.0f,3.6f,0.3f);//缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//...........................桌子的左边桌腿...................//glPushMatrix();//压入堆栈glColor3f(0.0,0.0,0.0);glTranslatef(25.0f,-17.0f,-32.5f+i*9);//平移变换glScalef(0.5f,8.0f,0.3f);//缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//...........................桌子的右边桌腿...................//glPushMatrix();//压入堆栈glColor3f(0.0,0.0,0.0);glTranslatef(35.0f,-17.0f,-32.5f+i*9);//平移变换glScalef(0.5f,8.0f,0.3f);//缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//............................椅子............................//glPushMatrix();//压入堆栈glColor3f(0.2,0.8,0.8);glTranslatef(30.0f,-15.0f,-25.0+i*9);//平移变换glScalef(11.3f,0.3f,3.5f);//缩放变换glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//.....................................................第二张桌椅....................................................// //..........................桌子的上面.......................//glPushMatrix();glColor3f(1.0,1.0,0.45);glTranslatef(0.0f,-10.0f,-30.0+i*9);glScalef(26.0f,0.3f,5.0f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//..........................桌子的下面......................//glPushMatrix();glColor3f(1.0,1.0,0.45);glTranslatef(0.0f,-13.0f,-30.0+i*9);glScalef(24.0f,0.3f,5.0f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//...........................桌子的后面......................//glPushMatrix();glColor3f(0.2,0.8,0.8);glTranslatef(0.0f,-12.0f,-32.5f+i*9);glScalef(24.0f,3.6f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//...........................桌子的左边桌腿...................//glPushMatrix();glColor3f(0.0,0.0,0.0);glTranslatef(-11.4f,-17.0f,-32.5f+i*9);glScalef(0.5f,8.0f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//...........................桌子的右边桌腿...................//glPushMatrix();glColor3f(0.0,0.0,0.0);glTranslatef(11.4f,-17.0f,-32.5f+i*9);glScalef(0.5f,8.0f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//............................椅子............................//glPushMatrix();glColor3f(0.2,0.8,0.8);glTranslatef(0.0f,-15.0f,-25.0+i*9);glScalef(24.3f,0.3f,3.5f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//........................................第三张桌椅..................................................////..........................桌子的上面.......................//glPushMatrix();glColor3f(1.0,1.0,0.45);glTranslatef(-30.0f,-10.0f,-30.0+i*9);glScalef(13.0f,0.3f,5.0f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//..........................桌子的下面......................//glPushMatrix();glColor3f(1.0,1.0,0.45);glTranslatef(-30.0f,-13.0f,-30.0+i*9);glScalef(11.0f,0.3f,5.0f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//...........................桌子的后面......................//glPushMatrix();glColor3f(0.2,0.8,0.8);glTranslatef(-30.0f,-12.0f,-32.5f+i*9);glScalef(11.0f,3.6f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//...........................桌子的左边桌腿...................//glPushMatrix();glColor3f(0.0,0.0,0.0);glTranslatef(-25.0f,-17.0f,-32.5f+i*9);glScalef(0.5f,8.0f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//...........................桌子的右边桌腿...................//glPushMatrix();glColor3f(0.0,0.0,0.0);glTranslatef(-35.0f,-17.0f,-32.5f+i*9);glScalef(0.5f,8.0f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//............................椅子............................//glPushMatrix();glColor3f(0.2,0.8,0.8);glTranslatef(-30.0f,-15.0f,-25.0+i*9);glScalef(11.3f,0.3f,3.5f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();}//..........................................最后一排的椅背..........................................////....................最右边的椅背..................//glPushMatrix();glColor3f(0.2,0.8,0.8);glTranslatef(30.0f,-15.0f,12.6f);glScalef(11.3f,12.0f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//.....................中间的椅背...................//glPushMatrix();glColor3f(0.2,0.8,0.8);glTranslatef(0.0f,-15.0f,12.6f);glScalef(24.3f,12.0f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//.....................最左边的椅背.................//glPushMatrix();glColor3f(0.2,0.8,0.8);glTranslatef(-30.0f,-15.0f,12.6f);glScalef(11.3f,12.0f,0.3f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glutSolidCube(1.0);glPopMatrix();//................................风扇................................................//GLuint m=0;for(;m<2;m++)//一共两排风扇{qobj = gluNewQuadric();//初始化二次曲面并创建一个指向二次曲面的指针//...............................右边的风扇.............................//glPushMatrix();//压入堆栈,保证此处坐标变换不影响外部大环境glTranslatef(20.0,-3.0,-10.0-40*m); //风扇的位置if(TurnOn==TRUE) //如果TurnOn为1{fantheta+=10; //风扇转过的角度fantheta不断增加if(fantheta==360) //如果旋转角度超过360度fantheta=0; //则fantheta重新回0}glRotatef(fantheta,0,1,0); //风扇旋转//..........风扇中间的扁圆形....................//glPushMatrix();//压入堆栈glColor3f(0.7,0.7,0.7);glTranslatef(0.0,20.0,0.0);//平移变换glScalef(1,0.3,1);//缩放变换gluSphere(qobj,2,20,20);//绘制一个半径为2的球体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glPopMatrix();//弹出堆栈//............风扇旋转120度的扇叶...............//glPushMatrix();//压入堆栈glColor3f(0.7,0.7,0.7);glTranslatef(0,20,0.0);//平移变换glScalef(1,0.05,1);//缩放变换glRotatef(120,0,1,0);//绕y周旋转120度gluCylinder(qobj,1,3,10,20,20);//绘制一个底面圆半径为1、顶面圆半径为2、高为10的圆锥体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glPopMatrix();//弹出堆栈//............风扇不做旋转的扇叶.................//glPushMatrix();//压入堆栈glColor3f(0.7,0.7,0.7);glTranslatef(0,20,0.0);//平移变换glScalef(1,0.05,1);//缩放变换gluCylinder(qobj,1,3,10,20,20);//绘制一个底面圆半径为1、顶面圆半径为2、高为10的圆锥体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glPopMatrix();//弹出堆栈//.............风扇旋转240度的扇叶...............//glPushMatrix();//压入堆栈glColor3f(0.7,0.7,0.7);glTranslatef(0,20,0.0);//平移变换glScalef(1,0.05,1);//缩放变换glRotatef(240,0,1,0);//绕y周旋转240度gluCylinder(qobj,1,3,10,20,20);//绘制一个底面圆半径为1、顶面圆半径为2、高为10的圆锥体glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glPopMatrix();//弹出堆栈//.............风扇的杆...........................//glPushMatrix();//压入堆栈glTranslatef(0,33,0.0);//平移变换glRotatef(90,1,0,0);//缩放变换gluCylinder(qobj,0.5,0.5,13,10,10);//绘制一个半径为0.5、高为13的圆锥体glPopMatrix();//弹出堆栈glPopMatrix();//弹出堆栈//................左边的风扇...........................................//glPushMatrix();glTranslatef(-20.0,-3.0,-10.0-40*m);if(TurnOn==TRUE){fantheta+=10;if(fantheta==360)fantheta=0;}glRotatef(fantheta,0,1,0);//..........风扇中间的扁圆形....................//glPushMatrix();//风扇中间的扁圆形glColor3f(0.7,0.7,0.7);glTranslatef(0.0,20.0,0.0);glScalef(1,0.3,1);gluSphere(qobj,2,20,20);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glPopMatrix();//............风扇旋转120度的扇叶...............//glPushMatrix();//风扇旋转120度的扇叶glColor3f(0.7,0.7,0.7);glTranslatef(0,20,0.0);glScalef(1,0.05,1);glRotatef(120,0,1,0);gluCylinder(qobj,1,3,10,20,20);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glPopMatrix();//............风扇不做旋转的扇叶.................//glPushMatrix();//风扇不做旋转的扇叶glColor3f(0.7,0.7,0.7);glTranslatef(0,20,0.0);glScalef(1,0.05,1);gluCylinder(qobj,1,3,10,20,20);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glPopMatrix();//.............风扇旋转240度的扇叶...............//glPushMatrix();//风扇旋转240度的扇叶glColor3f(0.7,0.7,0.7);glTranslatef(0,20,0.0);glScalef(1,0.05,1);glRotatef(240,0,1,0);gluCylinder(qobj,1,3,10,20,20);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glPopMatrix();//.............风扇的杆...........................//glPushMatrix();glTranslatef(0,33,0.0);glRotatef(90,1,0,0);gluCylinder(qobj,0.5,0.5,13,10,10);glPopMatrix();glPopMatrix();}//...........................................门.....................................................................//glColor3f(0.521f,0.121f,0.0547f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,diffusion);//定义材质光照glBindTexture(GL_TEXTURE_2D,texture[3]);//绑定纹理glBegin(GL_QUADS);//开始绘制四边形glColor3f(1.0f, 1.0f, 1.0f);glNormal3f(-1.0f, 0.0f, 0.0f);//glNormal3f用于定义点的法向量//............................前门.........................................//glTexCoord2f(0.0,1.0);glVertex3f( 49.9f, 20.0f, -70.0f);//左上glTexCoord2f(1.0,1.0);glVertex3f( 49.9f, 20.0f, -45.0f);//右上glTexCoord2f(1.0,0.0);glVertex3f( 49.9f, -21.0f, -45.0f);//右下glTexCoord2f(0.0,0.0);glVertex3f( 49.9f, -21.0f, -69.9f);//左下//............................后门.....................................//glTexCoord2f(0.0,1.0);glVertex3f( 49.9f, 20.0f, 5.0f);//左上glTexCoord2f(1.0,1.0);glVertex3f( 49.9f, 20.0f, 30.0f);//右上glTexCoord2f(1.0,0.0);glVertex3f( 49.9f, -21.0f, 30.0f);//右下glTexCoord2f(0.0,0.0);glVertex3f( 49.9f, -21.0f, 5.0f);//左下glEnd();//..............................................窗户.............................................................////.....................右面墙上的窗户......................................//glBindTexture(GL_TEXTURE_2D,texture[2]);//绑定纹理glBegin(GL_QUADS);//开始绘制四边形glColor4f(1.0f,1.0f,1.0f,0.5f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glNormal3f(-1.0f, 0.0f, 0.0f);//glNormal3f用于定义点的法向量glBlendFunc(GL_SRC_ALPHA,GL_ONE);// 基于源象素alpha通道值的半透明混合函数glTexCoord2f(0.0,1.0);glVertex3f( 49.9f,29.0f,-35.0f);//左上glTexCoord2f(1.0,1.0);glVertex3f( 49.9f,29.0f,0.0f);//右上glTexCoord2f(1.0,0.0);glVertex3f( 49.9f,10.0f,0.0f);//右下glTexCoord2f(0.0,0.0);glVertex3f( 49.9f,10.0f,-35.0f);//左下glEnd();//......................左面墙上的窗户(两扇)..............................//glBegin(GL_QUADS);//开始绘制四边形glNormal3f(1.0f, 0.0f, 0.0f);//glNormal3f用于定义点的法向量glColor4f(1.0f,1.0f,1.0f,0.5f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);glTexCoord2f(0.0,1.0);glVertex3f( -49.9f, 15.0f,-60.0f);//左上glTexCoord2f(1.0,1.0);glVertex3f( -49.9f, 15.0f,-20.0f);//右上glTexCoord2f(1.0,0.0);glVertex3f( -49.9f, -10.0f,-20.0f);//右下glTexCoord2f(0.0,0.0);glVertex3f( -49.9f, -10.0f,-60.0f);//左下glTexCoord2f(0.0,1.0);glVertex3f( -49.9f, 15.0f,-10.0f);//左上glTexCoord2f(1.0,1.0);glVertex3f( -49.9f, 15.0f,30.0f);//右上glTexCoord2f(1.0,0.0);glVertex3f( -49.9f, -10.0f,30.0f);//右下glTexCoord2f(0.0,0.0);glVertex3f( -49.9f, -10.0f,-10.0f);//左下glEnable(GL_BLEND);// 打开混合glDisable(GL_DEPTH_TEST);// 关闭深度测试glEnd();//............................................灯......................................................//GLuint j=0;for(;j<2;j++) //一共两排灯{glBindTexture(GL_TEXTURE_2D,texture[4]);//绑定纹理glColor3f(1.0f,1.0f,1.0f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照glBegin(GL_QUADS);//开始绘制四边形glNormal3f(0.0f, -1.0f, 0.0f);//glNormal3f用于定义点的法向量glTexCoord2f(0.0f, 1.0f);glVertex3f( 25.0f, 29.9f, -70.0f+j*40);//左上glTexCoord2f(1.0f, 1.0f);glVertex3f( 45.0f, 29.9f, -70.0f+j*40);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 45.0f, 29.9f, -50.0f+j*40);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 25.0f, 29.9f, -50.0f+j*40);//左下glColor3f(1.0f,1.0f,1.0f);glNormal3f(0.0f, -1.0f, 0.0f);glTexCoord2f(0.0f, 1.0f);glVertex3f( -10.0f, 29.9f, -70.0f+j*40);//左上glTexCoord2f(1.0f, 1.0f);glVertex3f( 10.0f, 29.9f, -70.0f+j*40);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f( 10.0f, 29.9f, -50.0f+j*40);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f( -10.0f, 29.9f, -50.0f+j*40);//左下glColor3f(1.0f,1.0f,1.0f);glNormal3f(0.0f, -1.0f, 0.0f);glTexCoord2f(0.0f, 1.0f);glVertex3f( -45.0f, 29.9f, -70.0f+j*40);//左上glTexCoord2f(1.0f, 1.0f);glVertex3f( -25.0f, 29.9f, -70.0f+j*40);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f( -25.0f, 29.9f, -50.0f+j*40);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f( -45.0f, 29.9f, -50.0f+j*40);//左下glEnd();}//....................................讲台.............................................................////.....................讲台的桌子........................................//glPushMatrix();//压入堆栈glColor3f(0.5f,0.9f,0.5f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义光照材质glTranslatef(-0.0f,-10.0f,-60.5f);//平移变换glScalef(20.0f,20.0f,10.0f);//缩放变换glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//......................地面上高起的平台.................................//glPushMatrix();//压入堆栈glColor3f(0.8f,0.8f,0.8f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义光照材质glTranslatef(0.0f,-20.0f,-70.0f);//平移变换glScalef(65.0f,2.9f,30.0f);//缩放变换glutSolidCube(1.0);//绘制立方体glPopMatrix();//弹出堆栈//........................................黑板............................................................//glBindTexture(GL_TEXTURE_2D, texture[5]); //绑定纹理glBegin(GL_QUADS); //绘制四边形glColor3f(1.0f, 1.0f, 1.0f);glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义光照材质glNormal3f(0.0f, 0.0f, 1.0f);//glNormal3f用于定义点的法向量glTexCoord2f(1.0f, 1.0f);glVertex3f(-25.0f, 20.0f, -79.9f);//右上glTexCoord2f(1.0f, 0.0f);glVertex3f(-25.0f, -5.0f, -79.9f);//右下glTexCoord2f(0.0f, 0.0f);glVertex3f( 25.0f, -5.0f, -79.9f);//左下glTexCoord2f(0.0f, 1.0f);glVertex3f( 25.0f, 20.0f, -79.9f);//左上glEnd();//........................................时钟..........................................................//_strtime(timebuffer);//取系统时间到timebuffer数组中hour=((int)timebuffer[0]-48)*10+((int)timebuffer[1]-48);//从timebuffer数组中得到小时的值miniter=((int)timebuffer[3]-48)*10+((int)timebuffer[4]-48);//从timebuffer数组中得到分钟。

OpenGL函数简介

OpenGL函数简介

附录A OpenGL函数简介OpenGL是国际公认的在计算机中使用广泛、易学易用的三维图形标准,附录A给出了本教材所用OpenGL函数的简单说明(/documentation/manual/),供读者查询使用。

1.glAccumvoid glAccum ( GLenum op , GLfloat value );参数说明:op 取符号:GL_ACCUM,GL_LOAD,GL_ADD,GL_MULT,GL_RETURN。

value 取一个浮点数,op决定怎样使用value。

功能描述:按参数op指定的方式,在累积缓冲区中进行如下操作GL_ACCUM 从当前选定的缓冲区(缺省值为当前的颜色缓冲区)中逐点读取其R、G、B、A值,该RGBA乘以value加上累积缓冲区中的当前值后,再存入累积缓冲区中保存。

GL_LOAD 从当前选定的缓冲区中逐点读取其R、G、B、A值,该RGBA乘以value 后,再存入累积缓冲区中保存。

GL_ADD 将value直接加到累积缓冲区中每点的RGBA上。

GL_MULT 略。

GL_RETURN 将累积缓冲区中的RGBA乘以value后,送当前颜色缓冲区中显示。

2.glBegin, glEndvoid glBegin ( GLenum mode );参数说明:mode 取符号:GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS,GL_QUAD_STRIP和 GL_POLYGON。

void glEnd (void );功能描述:函数glBegin, glEnd成对出现,用来界定一个或一组类似图形元素顶点数据的开始与结束,图形元素的类型由mode确定。

GL_POINTS 每个顶点函数glVertex()描述了一个个孤立的顶点数据。

OpenGL学习笔记

OpenGL学习笔记OpenGL学习笔记第一章1.OpenGL会利用插值算法将3个顶点连成三角形2.OpenGL中的阴暗处理有两种模式:GL_SMOOTH、GL_FLAT。

GL_SMOOTH:OpenGL将根据顶点的颜色,插值生成其他点的颜色,形成颜色渐变、过渡的效果。

GL_FLAT:没有颜色渐变和过渡的效果。

例如:对三角形单调着色,取最后一个顶点的颜色填充三角形。

3.glColor3ub(): 参数类型为GLubyte,范围为[0,255]glColor3f(): 参数类型为GLfloat,范围为[0.0f,1.0f] .glColor3f()中的参数大于1.0f时,OpenGL 会将参数值钳位至 1.0f。

两者的功能相同。

例如:glColor3ub(51,255,0)和glColor3f(0.2f,1.0f,0.0f)定义了相同的颜色。

4.设置色差可以使物体的3D效果更明显。

例如:金字塔两侧面的颜色较深,前后面的颜色较浅,可使观察者产生错觉,凸现3D效果。

5.void auxSolidBox(GLdouble width,GLdouble height,GLdouble depth) //绘制长方体6.顶点的绘制顺序只是会影响到面的法线方向的确定。

GLFrontFace(GL_CW)和glFrontFace(GL_CC W)(默认)可以决定顺时针还是逆时针的一面为正面。

7。

glPushMatrix(), glPopMatrix();可以在绘制多个物体时,方便地控制各个物体的坐标。

8。

void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z) angle:旋转的角度,向量(x,y,z)所在的直线表示转轴。

该函数将当前坐标系绕(x,y,z)轴逆时针旋转angle角度。

9。

#pragma comment( lib, "opengl32.lib" ) // 链接时查找OpenGL32.lib #pragma comment( lib, "glu32.lib" ) // 链接时查找glu32.lib#pragma comment( lib, "glaux.lib" )10。

3 OpenGL


OpenGL的颜色

RGBA 模式: 用RGB定义颜色


void glColor<x><t> (red, green, blue, alpha); x =3 时,参数为R、G、B ; x =4时还包括Alpha 值(0.0 -1.0)

颜色表模式:从颜色表中选取当前颜色
void glIndex{sifd}(TYPE c); void glIndex{sifd}v(TYPE *c); 参数值c 用于设置当前颜色索引值,即调色板号, 若值大于颜色位面数时则取模。 参cindex
OpenGL中,曲线和曲面的构造借助于求值器完成。利用求值器 可自动生成顶点坐标、法线坐标和纹理坐标,其次,要激活求 值器,使其进行曲线映射。最后,要将求值器生成的各顶点连 接起来生成一条完整的曲线



glMaplf(……) 定义求值器 (传递控制点,指明数据类型及u的值域) glEnable(……) 启动求值器 glMapGridlf() 给出u的区间划分(常用等分) 即( u1=u0,u1,u2,……,un=u2 ) glEvalMeshl() 在上述区间上选取u值求值(即曲线上的点), 并用该点绘制曲线
GLdouble radius 圆锥体基底的半径。 GLdouble height 圆锥体的高度。 GLint slices 圆锥体围绕z 轴的分割数。 GLint stacks 圆锥体数沿着z 轴的分割数。 绘制沿着z 轴方向定位的圆锥体。圆锥体的基底定位于z = 0 平 面内,顶点z = height,圆锥体围绕z 轴分割为slices 个数目,沿 着z 轴分割为stacks个数目。
该顶点序列定义一条折线 该顶点序列定义一条闭合折线

计算机图形学OpenGL版实验1-4

实验1 OpenGL初识一、实验目的:熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。

二、实验内容:(1)了解和使用VC的开发环境,理解简单的OpenGL程序结构。

(2)掌握OpenGL提供的基本图形函数,尤其是生成点的函数。

三、该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点,如图所示。

下面对各行语句进行说明:首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。

然后看main函数。

int main(int argc, char *argv[]),这个是带命令行参数的main函数。

这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍;1)glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。

其格式比较固定,一般都是glutInit(&argc, argv)就行;2) glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。

GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。

更多信息,以后的实验教程会有讲解介绍;3) glutInitWindowPosition,设置窗口在屏幕中的位置;4) glutInitWindowSize,设置窗口的大小;5) glutCreateWindow,根据前述设置的信息创建窗口。

参数将被作为窗口的标题。

注意:窗口被创建后,并不立即显示到屏幕上。

需要调用glutMainLoop才能看到窗口;6) glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。

(暂且这样理解);7) glutMainLoop,进行一个消息循环。

OpenGL显示列表

id = glGenLists(1) glNewList(id, GL_COMPILE) ...//(OpenGL函数) glEndList() (2)调用显示表 glCallList(id); // 调用显示表绘制图形 其前可以设置几何变换等操作。 (3)删除显示表
在退出程序前必须将所建立的显示表删除,释放显示表占用的资源。glDeleteLists(GLuint list, GLsizei range)用来删除用户建立的显示表:参数list表示要删除的第一个显示表的数字名 称;参数range表示从指定的第一个显示表开始要删除的显示表个数。本节中只有一个显示表,所 以range=1。如果建立了多个显示表,则可设置range的值来一次性删除多个显示表。比如有box0、 box1、box2、box3四个连续分配的显示表,则glDeleteLists(box1,3)将把显示表box1、box2、box3 删除,box0未被删除。
box = glGenLists(1); // 申请一个显示表空间
glNewList(box,GL_COMPILE); // 开始创建box显示表
glBegin(GL_QUADS);
// 外面一个较大的正方体
// 上表面
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
...
glEnd();
glEndList();
(2)在绘图函数中调用显示列表。
glTranslatef(0.0f, 0.0f,-50.0f); // 移入屏幕50.0f
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

glBegin()用法小结
1.在glBegin()和glEnd()之间可调用的函数
函数 函数意义
glVertex*() 设置顶点坐标
glColor*() 设置当前颜色
glIndex*() 设置当前颜色表
glNormal*() 设置法向坐标
glEvalCoord*() 产生坐标
glCallList(),glCallLists() 执行显示列表
glTexCoord*() 设置纹理坐标
glEdgeFlag*() 控制边界绘制
glMaterial*() 设置材质
表7-2 在glBegin()和glEnd()之间可调用的函数

glVertex3f()表示了该函数属于 gl库,参数是三个float型参数指针。我们用glVertex*()来
表示这一类函数。

基本库
2.几何图元类型和说明
类型 说明
GL_POINTS 单个顶点集
GL_LINES 多组双顶点线段
GL_POLYGON 单个简单填充凸多边形
GL_TRAINGLES 多组独立填充三角形
GL_QUADS 多组独立填充四边形
GL_LINE_STRIP 不闭合折线
GL_LINE_LOOP 闭合折线
GL_TRAINGLE_STRIP 线型连续填充三角形串
GL_TRAINGLE_FAN 扇形连续填充三角形串
GL_QUAD_STRIP 连续填充四边形串

相关文档
最新文档