OpenGL编程参考手册
- 格式:doc
- 大小:46.00 KB
- 文档页数:5
OpenGL基础图形编程- 总目录出处:中国游戏开发者[ 2001-09-20 ]作者:总目录第一章OpenGL与三维图形世界1.1 OpenGL使人们进入三维图形世界1.2 OpenGL提供直观的三维图形开发环境1.3 OpenGL称为目前三维图形开发标准第二章OpenGL概念建立2.1 OpenGL基本理解2.2 OpenGL工作流程2.3 OpenGL图形操作步骤第三章Windows NT环境下的OpenGL3.1 Windows NT下的OpenGL函数3.2 OpenGL基本功能3.3 Windows NT下OpenGL结构第四章OpenGL基本程序结构第五章OpenGL数据类型和函数名第六章OpenGL辅助库的基本使用6.1 辅助库函数分类6.2 辅助库应用示例第七章OpenGL建模7.1 描述图元7.1.1 齐次坐标7.1.2 点7.1.3 线7.1.4 多边形7.2 绘制图元7.2.1 定义顶点7.2.2 构造几何图元第八章OpenGL变换8.1 从三维空间到二维平面8.1.1 相机模拟8.1.2 三维图形显示流程8.1.3 基本变换简单分析8.2 几何变换8.2.1 两个矩阵函数解释8.2.2 平移8.2.3 旋转8.2.4 缩放和反射8.2.5 几何变换举例8.3 投影变换8.3.1 正射投影8.3.2 透视投影8.4 裁剪变换8.5 视口变换8.6 堆栈操作第九章OpenGL颜色9.1 计算机颜色9.1.1 颜色生成原理9.1.2 RGB色立体9.2 颜色模式9.2.1 RGBA模式9.2.2 颜色表模式9.2.3 两种模式应用场合9.3 颜色应用举例第十章OpenGL光照10.1 真实感图形基本概念10.2 光照模型10.2.1 简单光照模型10.2.2 OpenGL光组成10.2.3 创建光源10.2.4 启动光照10.3 明暗处理10.4 材质10.4.1 材质颜色10.4.2 材质定义10.4.3 材质RGB值和光源RGB值的关系10.4.4 材质改变第十一章OpenGL位图和图像11.1 位图11.1.1 位图和字符11.1.2 当前光栅位置11.1.3 位图显示11.2 图像11.2.1 象素读写11.2.2 象素拷贝11.2.3 图像缩放11.2.4 图像例程第十二章OpenGL纹理12.1 基本步骤12.2 纹理定义12.3 纹理控制12.3.1 滤波12.3.2 重复与约简12.4 映射方式12.5 纹理坐标12.5.1 坐标定义12.5.2 坐标自动产生第十三章OpenGL复杂物体建模13.1 图元扩展13.1.1 点和线13.1.2 多边形13.2 法向计算13.2.1 法向基本计算方法13.2.2 法向定义13.3 曲线生成13.3.1 曲线绘制举例13.3.2 曲线定义和启动13.3.3 曲线坐标计算13.3.4 定义均匀间隔曲线坐标值13.4 曲面构造13.4.1 曲面定义和坐标计算13.4.2 定义均匀间隔的曲面坐标值13.4.3 纹理曲面13.4.4 NURBS曲面第十四章OpenGL特殊光处理14.1 光照模型14.1.1 全局环境光14.1.2 近视点与无穷远视点14.1.3 双面光照14.2 光源位置与衰减14.3 聚光与多光源14.3.1 聚光14.3.2 多光源与例程14.4 光源位置与方向的控制14.5 辐射光第十五章OpenGL效果处理15.1 融合15.1.1 Alpha值与融合15.1.2 融合因子15.1.3 融合实例15.2 反走样15.2.1 行为控制函数15.2.2 点和线的反走样15.2.3 多边形的反走样15.3 雾15.3.1 雾的概论和例程15.3.2 雾化步骤第十六章OpenGL显示列表16.1 显示列表概论16.1.1 显示列表的优势16.1.2 显示列表的适用场合16.2 创建和执行显示列表16.2.1 创建显示列表16.2.2 执行显示列表16.3 管理显示列表16.4 多级显示列表第十七章OpenGL帧缓存和动画17.1 帧缓存17.1.1 帧缓存组成17.1.2 缓存清除17.2 动画【下页】【打印】【关闭】[ 字号:大·中·小]OpenGL基础图形编程- OpenGL与3D图形世界出处:中国游戏开发者[ 2001-09-20 ]作者:目录1.1 OpenGL使人们进入三维图形世界1.2 OpenGL提供直观的三维图形开发环境1.3 OpenGL成为目前三维图形开发标准1.1、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 简介二、OpenGL 函数库1.核心函数库2.矩阵操作、几何变换和投影变换函数3.交互式输入设备函数三、OpenGL 扩展库 GLEW正文一、OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染 2D 和 3D 图形。
OpenGL 提供了一套完整的图形渲染 API,可以实现各种视觉效果,如颜色、光照、阴影、纹理贴图等。
它广泛应用于游戏开发、计算机辅助设计、虚拟现实、科学可视化等领域。
二、OpenGL 函数库OpenGL 函数库包含许多可以用于绘制图形的函数。
这些函数可以根据其功能分为不同的类别,主要包括:1.核心函数库:这个库包含了 OpenGL 的基本功能,如绘制基本的几何图元(glBegin)、设置颜色(glColor3f)等。
2.矩阵操作、几何变换和投影变换函数:这个库包含了用于操作矩阵、实现几何变换和投影变换的函数。
例如,矩阵入栈(glPushMatrix)、矩阵出栈(glPopMatrix)、矩阵乘法(glMultMatrix)等。
3.交互式输入设备函数:这个库包含了用于处理交互式输入设备的函数,例如鼠标和键盘。
这些函数可以让用户在程序中进行操作,如点击、拖动、滚动等。
三、OpenGL 扩展库 GLEWGLEW(GL Extension Wrangler Library)是一个 OpenGL 扩展库,用于简化 OpenGL 扩展的加载和使用过程。
GLEW 提供了一系列的函数,用于查询、启用和禁用 OpenGL 扩展。
使用 GLEW,开发者无需关心扩展的加载和启用,只需关注功能的实现。
总之,OpenGL 是一套功能强大的图形编程接口,包含了丰富的函数库,可以实现各种复杂的图形渲染效果。
实验⼀OpenGL图形编程⼊门实验⼀ OpenGL图形编程⼊门三、实验内容1、建⽴⼀个⼯程⽂件,并运⾏样本程序my first program.cpp,观看结果。
(6)在⼯程⽂件中输⼊样本程序,单击启动调试按钮,观察运⾏结果。
样本程序:my first program.cpp#includevoid display(void){glClear(GL_COLOR_BUFFER_BIT); //刷新颜⾊缓冲区glFlush(); //⽤于刷新命令队列和缓冲区,使所有尚未被执⾏的OpenGL命令得到执⾏}void main(int argc, char** argv){glutInit(&argc, argv); //初始化GLUT库glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //设置显⽰模式 glutCreateWindow("hello"); //创建窗⼝,标题为“hello”glutDisplayFunc(display); //⽤于绘制当前窗⼝glutMainLoop(); //表⽰开始运⾏程序,⽤于程序的结尾}运⾏结果:创建⼀个名称是“hello”的窗⼝。
如图1-7所⽰。
2、认真阅读样本程序,理解每个函数的作⽤,并修改窗⼝标题,显⽰为“我的第⼀个OpenGL程序”。
3、窗⼝的设置。
在默认情况下,窗⼝的位置出现在屏幕的左上⾓,默认⼤⼩为300*300。
要求:修改窗⼝⼤⼩为其他尺⼨。
参考函数:glutInitWindowPosition(int x, int y);//为窗⼝指定初始位置,窗⼝左上⾓在屏幕上的位置为(x,y) glutInitWindowSize(int width, int height); //设置窗⼝⼤⼩4、背景⾊的设置。
在默认情况下背景⾊是⿊⾊。
要求:(1)将窗⼝背景设置为⽩⾊(2)将窗⼝背景设置为其他颜⾊参考函数:glClearColor(r,g,b,alpha);//设置背景颜⾊,此函数放在display()中,并且放在glClear(GL_COLOR_BUFFER_BIT);语句的前⾯。
现代OpenGL教程 01——入门指南欢迎大家,这是现代OpenGL教程系列的第一篇。
所有代码都是开源的,你可以在GitHub上下载:https:///tomdalling/opengl-series 通过这篇教程,你将会学到如何在Windows下用Visual Studio 2013或Mac下用Xcode搭建OpenGL 3.2工程。
该应用包含一个顶点着色器(vertex shader),一个片段着色器(fragment shader)和使用VAO和VBO来绘制的三角形。
该工程使用GLEW来访问OpenGL API,用GLFW来处理窗口创建和输入,还有使用GLM进行矩阵/矢量相关的数学运算。
这听上去有点无聊,但搭建这样的工程确实挺麻烦的,尤其对于初学者。
只要解决完这问题,我们就可以开始玩些有趣的东西了。
[TOC]获取代码所有例子代码的zip打包可以从这里获取:https:///tomdalling/opengl-series/archive/master.zip。
这一系列文章中所使用的代码都存放在:https:///tomdalling/opengl-series。
你可以在页面中下载zip,加入你会git的话,也可以复制该仓库。
本文代码你可以在source/01_project_skeleton目录里找到。
使用OS X系统的,可以打开根目录里的opengl-series.xcodeproj,选择本文工程。
使用Windows系统的,可以在Visual Studio 2013里打开opengl-series.sln,选择相应工程。
工程里已包含所有依赖,所以你不需要再安装或者配置额外的东西。
如果有任何编译或运行上的问题,请联系我。
关于兼容性的提醒本文使用OpenGL 3.2,但我会尝试保持如下兼容:向后兼容OpenGL 2.1向前兼容OpenGL 3.X和4.X兼容Android和iOS的OpenGL ES 2.0因为OpenGL和GLSL存在许多不同版本,本文代码不一定能做到100%上述兼容。
#include "stdafx.h"#include <glut.h>#include <gl/gl.h>void display(){glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,1.0,0.0,1.0); // set the point colorglPointSize(10);glBegin(GL_POLYGON);glVertex2f(0.0,0.0);glVertex2f(0.0,3.0);glVertex2f(4.0,3.0);glVertex2f(6.0,1.5);glVertex2f(4.0,0.0);glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("第一个OpenGL程序");glutDisplayFunc(display);glutMainLoop();return 0;}#include "stdafx.h"#include <glut.h>#include <gl/gl.h>void display(){glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,0.0,0.0,1.0); // set the point colorglPointSize(10);glBegin(GL_POINTS);glVertex3f(-0.5,-0.5,0.0);glVertex3f(0.5,-0.5,0.0);glVertex3f(0.5,0.5,0.0);glVertex3f(-0.5,0.5,0.0);glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("第一个OpenGL程序");glutDisplayFunc(display);glutMainLoop();return 0;}#include"stdafx.h"#include<glut.h>#include<gl/gl.h>void display(){glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,1.0,0.0,1.0);glPointSize(10);glBegin(GL_TRIANGLES);glVertex3f(0.25,0.25,0.0);glVertex3f(0.75,0.25,0.0);glVertex3f(0.75,0.75,0.0);glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("第台?一?个?OpenGL程ì序ò"); glutDisplayFunc(display);glutMainLoop();return 0;}#include<glut.h>#include<gl/gl.h>void display() // 绘?制?函ˉ数簓{glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,1.0,0.0,1.0);glPointSize(10);glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);glBegin(GL_POLYGON);glEdgeFlag(GL_TRUE);glVertex3f (0.25,0.25,0.0);glEdgeFlag(GL_FALSE);glVertex3f(0.75,0.25,0.0);glEdgeFlag(GL_TRUE);glVertex3f(0.75,0.75,0.0);glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("标括?记?多à变?形?边?界?边?");glutDisplayFunc(display);glutMainLoop();return 0;}#include"stdafx.h"#pragma comment( lib, "opengl32.lib" )#pragma comment( lib, "glu32.lib" )#pragma comment( lib, "glut32.lib")#include<stdlib.h>#include<glut.h>void background(void){glClearColor(0.0,0.0,0.0,0.0);//设Θ?置?背?景°颜?色?为a黑ú色?}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);//buffer设Θ?置?为a颜?色?可é写′glBegin(GL_TRIANGLES);//开a始?画-三▂角?形?glShadeModel(GL_SMOOTH);//设Θ?置?为a光a滑?明÷暗悝?模£式?glColor3f(1.0,0.0,0.0);//设Θ?置?第台?一?个?顶¥点?为a红ì色?glVertex2f(-1.0,-1.0);//设Θ?置?第台?一?个?顶¥点?的?坐?标括?为a(辍?1.0,?-1.0)?glColor3f(0.0,1.0,0.0);//设Θ?置?第台?二t个?顶¥点?为a绿ì色?glVertex2f(0.0,-1.0);//设Θ?置?第台?二t个?顶¥点?的?坐?标括?为a(辍?.0,?-1.0)?glColor3f(0.0,0.0,1.0);//设Θ?置?第台?三▂个?顶¥点?为a蓝?色?glVertex2f(-0.5,1.0);//设Θ?置?第台?三▂个?顶¥点?的?坐?标括?为a(辍?0.5,?1.0)?glEnd();//三▂角?形?结á束?glFlush();//强?制?OpenGL函ˉ数簓在ú有瓺限T时骸?间?内ú运?行D}void myReshape(GLsizei w,GLsizei h){glViewport(0,0,w,h);//设Θ?置?视酣?口úglMatrixMode(GL_PROJECTION);//指?明÷当獭?前°矩?阵ó为aGL_PROJECTIONglLoadIdentity();//将?当獭?前°矩?阵ó置?换?为a单蹋?位?阵óif(w <= h)gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定¨义?二t维?正y视酣?投?影?矩?阵óelsegluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);glMatrixMode(GL_MODELVIEW);//指?明÷当獭?前°矩?阵ó为aGL_MODELVIEW }int main(int argc,char ** argv){/*初?始?化ˉ*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);/*创洹?建¨窗洹?口ú*/glutCreateWindow("Triangle");/*绘?制?与?显?示?*/background();glutReshapeFunc(myReshape);glutDisplayFunc(myDisplay);glutMainLoop();return(0);}#include"stdafx.h"#pragma comment( lib, "opengl32.lib" )#pragma comment( lib, "glu32.lib" )#pragma comment( lib, "glut32.lib")#include<stdlib.h>#include<glut.h>static int shoulder = 0, elbow = 0;////shoulder:肩部角度,elbow:肘部角度void init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);glShadeModel(GL_FLAT);}void display(void){glClear(GL_COLOR_BUFFER_BIT);glPushMatrix();//把当前的变换矩阵压入opengl内部栈中,用以保存当前矩阵//画机器人的上臂glTranslatef(-1.0f, 0.0f, 0.0f);//用平移矩阵乘当前矩阵,格式为glTranslatef(x,y,z) glRotatef((GLfloat) shoulder, 0.0f, 0.0f, 1.0f);//用旋转矩阵乘当前矩阵,格式为glRotatef(角度,x轴,y轴,z轴),这里是绕z轴旋转glTranslatef(1.0f, 0.0f, 0.0f);//再用平移矩阵乘当前矩阵,注意顺序glPushMatrix();//变换矩阵压栈glScalef(2.0f, 0.4f, 1.0f);//用缩放矩阵乘以当前矩阵,格式为glRotatef(缩放比例,y缩放比例,z缩放比例)glutWireCube(1.0f);//glut库函数,画一个三维Cube,参数为边长glPopMatrix();//弹栈,现在矩阵恢复到使用缩放前的样子//画机器人的前臂,请注意平移矩阵和旋转矩阵的变化glTranslatef(1.0f, 0.0f, 0.0f);glRotatef((GLfloat) elbow, 0.0f, 0.0f, 1.0f);glTranslatef(1.0f, 0.0f, 0.0f);glPushMatrix();glScalef(2.0f, 0.4f, 1.0f);glutWireCube(1.0f);glPopMatrix();glPopMatrix();glFlush();}void reshape (int width, int height){glViewport(0, 0, width, height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 20.0f);//建立一个透视投影视图体,格式为:gluPerspective(视域的角度,宽高比,视点到近裁剪面的距离(总为正)) glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0f, 0.0f, -5.0f);//用平移矩阵乘当前矩阵,注意,这会将所有绘制过程中绘制的物体平移}void keyboard(unsigned char key, int x, int y){switch (key){case'a'://处理四个按键,改变旋转角度,转动手臂shoulder = (shoulder + 5) % 360;glutPostRedisplay();//重画break;case'd':shoulder = (shoulder - 5) % 360;glutPostRedisplay();break;case'q':elbow = (elbow + 5) % 360;glutPostRedisplay();break;case'e':elbow = (elbow - 5) % 360;glutPostRedisplay();break;case'x':exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow("Transform");init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;}#include"stdafx.h"#pragma comment( lib, "opengl32.lib" )#pragma comment( lib, "glu32.lib" )#pragma comment( lib, "glut32.lib")#include<stdlib.h>#include<glut.h>static int year = 0,day = 0;void init(void){glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT);}void display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glPushMatrix();glutWireSphere(1.0,20,16);glRotatef((GLfloat) year, 0.0, 1.0, 0.0); glTranslatef(2.0, 0.0, 0.0);glRotatef((GLfloat) day, 0.0, 1.0, 0.0);glutWireSphere(0.2,10,8);glPopMatrix();glutS();}void reshape (int w, int h){glViewport(0, 0, (GLsizei)w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(65.0f, (GLfloat)w/(GLfloat)h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,20.0);}void keyboard(unsigned char key, int x, int y){switch (key){case'd':day=(day+10)%360;glutPostRedisplay();break;case'D':day=(day-10)%360;glutPostRedisplay();break;case'y':year=(year+5)%360;glutPostRedisplay();break;case'Y':year=(year-5)%360;glutPostRedisplay();break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;}#include"stdafx.h"#pragma comment( lib, "opengl32.lib" ) #pragma comment( lib, "glu32.lib" )#pragma comment( lib, "glut32.lib")#include<stdlib.h>#include<glut.h>void init(void){glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT);}void display(void){GLdouble eqn[4]={0.0,1.0,0.0,0.0};GLdouble eqn2[4]={1.0,1.0,0.0,0.0}; glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glPushMatrix();glTranslatef(0.0,0.0,-5.0);glClipPlane(GL_CLIP_PLANE0,eqn);glEnable(GL_CLIP_PLANE0);glClipPlane(GL_CLIP_PLANE1,eqn2);glEnable(GL_CLIP_PLANE1);glRotatef(90.0,1.0,0.0,0.0);glutWireSphere(1.0,20,16);glPopMatrix();glFlush();}void reshape (int w, int h){glViewport(0, 0, (GLsizei)w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE| GLUT_RGB);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}Opengl相关库函数:GLU:设置视点矩阵和投影矩阵、执行多边形网格化以及渲染曲面等任务。
OpenGL编程初步OpenGL介绍●由SGI公司的GL发展而来的一个工业标准图形库。
●OpenGL由图形库GL(Graphics Library)和应用图形库GLU(Graphics Library Utilities)两个库组成。
●OpenGL是与平台无关的标准图形库,可在多种平台上运行。
确切地说是与窗口系统无关。
●OpenGL可在网络上运行,显示图形的计算机可以不是运行图形程序的计算机。
●但OpenGL没有事件处理(如鼠标,键盘输入等)和窗口管理(如大小,位置等)的功能。
●另一个辅助库GLUT提供了与平台无关的事件处理和窗口管理功能。
●实现事件处理和窗口管理等功能的另一个方法是使用OpenGL在特定窗口系统的扩展,如OpenGL的X扩展GLX,在Windows的扩展WGL。
OpenGL的发展●1992年7月,OpenGL 1.0;●1995年12月,OpenGL 1.1;●1998年3月,OpenGL 1.2;●1998年10月,OpenGL 1.2.1;●2001年8月,OpenGL 1.3;●2002年7月,OpenGL 1.4.●OpenGL由独立组织ARB(OpenGL ArchitectureReview Board)管理。
成立于1992年。
主要成员有IBM,SGI,Intel, Microsoft,Compaq等。
●另一独立组织OPC(OpenGL PerformanceCharacterization Committee)负责管理和发布OpenGL的性能测试基准(benchmark)。
OpenGL与Windows平台●Microsoft和SGI共同开发了OpenGL的WIN32版本,称为WGL。
最先OpenGL集成在Windows NT中,后来集成到了Windows95(OSR2)中。
Windows98已将OpenGL作为标准组成部分。
●运行OpenGL程序,需要在windows\system目录下有动态连接库opengl32.dll,glu32.dll,使用GLUT的用戶需要有glut32.dll。
openGL frame buffer object(FBO)fbo 扩展在openGL 3.0以后成为openGL核心特性,后缀EXT不再出现在扩展名中。
概览在openGL 渲染管线中,几何数据和纹理经过一系列测试最后以2d像素图渲染到屏幕上。
最后的渲染目的地叫做帧缓冲区。
帧缓冲区由一些openGL操作的2d数组和存储空间组成,如颜色缓冲区、深度缓冲区、模版缓冲区和累积缓冲区。
默认情况下,openGL用帧缓冲区作为最终渲染目的地,帧缓冲区完全由窗口系统创建了管理。
这个默认的帧缓冲区叫做“窗口系统提供的”缓冲区。
openGL扩展——GL_ARB_framebuffer_object提供了创建额外的不可显示的帧缓冲对象(fbo)。
这种帧缓冲对象叫做“应用程序创建的”帧缓冲区,以区别于“窗口系统创建”缓冲区。
通过使用帧缓冲对象,openGL应用程序可以重定向渲染输出到“应用程序创建的”缓冲区对象,“应用程序创建的”缓冲区完全由openGL控制。
类似“窗口系统创建的”缓冲区,fbo包含若干渲染目的地:颜色、深度、模版缓冲区(没有累积缓冲区)。
里面这些逻辑缓冲区叫做“可连接到帧缓冲对象的”图像,是一些2d数组或像素图。
有两种framebuffer-attachable图像:纹理图和渲染缓冲区图(renderbuffer image)。
若纹理对象被连接到帧缓冲对象,那么openGL执行“渲染到纹理”操作。
若renderbuffer对象连接到帧缓冲对象,那么openGL执行“离屏渲染”。
上图描述了帧缓冲对象、纹理对象、渲染缓冲对象之间的关系。
帧缓冲对象中可以连接多个纹理对象和渲染缓冲对象到连接点上。
图中显示有多个颜色连接点,一个深度连接点,一个模版连接点。
颜色连接点数量由具体实现决定,但一个fbo中至少要有一个。
通过GL_MAX_COLOR_ATTACHMENTS参数查阅当前显卡支持的最大值。
fbo中有多个颜色连接点是为了可以同时有多个渲染目的地。
OpenGL编程参考手册》(pdf)电子书下载笃志说明:《OpenGL编程参考手册》中文pdf版计算机电子书下载,本书不适合OpenGL新手入门,而适合一些已有比较深厚OpenGL基础的人士开发时使用.它更类似一个词典,将所有的OpenGL 记录,分类,仅此而已.前言OpenGL是一个图形硬件的软件接口(“GL”即Graphics Library)。
这一接口包含了数百个函数,图形程序员可以利用这些函数指定设计高品质的三维彩色图像所需的对象和操作。
这些函数中有许多实际上是其他函数的简单变形,因此,实际上它仅包含大约180个左右完全不同的函数。
OpenGL 实用库(OpenGL Utility Library,GLU)和对X窗口系统的OpenGL扩展(OpenGL Extension to the X Window System,GLX)为OpenGL提供了有用的支持特性和完整的OpenGL核心函数集。
本书详细介绍了这些函数的功能。
书中各章内容如下:第1章 OpenGL简介在概念上对OpenGL作了概述。
它通过一个高层的模块图来阐述OpenGL所执行的所有主要处理阶段。
第2章命令和例程概述较详细地阐述了OpenGL对输入数据的处理过程(用点形式来指定一个几何体或用像素形式来定义一幅图像时),并告诉你如何用OpenGL函数来控制这个过程。
此外,在本章中还对GLU和GLX函数作了讨论。
第3章命令和例程一览根据OpenGL命令所完成的功能列举说明了这些命令组。
一旦了解了这些命令的功能,你就可以利用这些完整的函数原型作为快速参考。
第4章定义的常量及相关命令列举了在OpenGL中定义的常量和使用这些常量的命令。
第5章 OpenGL参考说明本书的主体部分,它包括各组相关的OpenGL命令的描述。
带参数的命令和与之一起描述的其他命令仅在数据类型方面有所不同。
每个函数的参考说明介绍了参数、命令的作用和使用这些命令时可能发生的错误。
此外,本章还包含了有关OpenGL的 ARB扩展—多重纹理和绘图子集的参考说明。
需要说明的是并非所有的OpenGL的环境都支持ARB扩展。
?第6章 GLU参考说明本章包含了所有的GLU命令的参考说明。
?第7章 GLX参考说明本章包含了所有的GLX命令的参考说明。
0.1 阅读此书前的预备知识本书是OpenGL Architecture Review Board, Mason Woo、 Jackie Neider、Tom Davis 和Dave Shreinre编著的《OpenGL编程指南(第3版)》(Rea**, MA: Addison-Wesley,1999)的姊妹篇。
阅读这两本书的前提是你已经懂得如何用C语言编程。
两本书的不同之处主要在于:《OpenGL编程指南》一书着重于介绍如何运用OpenGL,而本书的重点则是OpenGL的工作方式。
当然要想彻底地了解OpenGL,这两方面的知识都是必需的。
这两本书的另一个不同点是本书的大多数内容都是按字母次序编排的,这样编排的前提是假定你已经知道你所不明白的地方而仅仅想查找某个特定命令的用法。
而《OpenGL 编程指南》一书的编排则更像一本指南:它首先解释了OpenGL的简单概念,然后再导出更复杂的概念。
虽然你不必通过阅读《OpenGL编程指南》一书来理解本书对命令的解释,但如果你已经读过它,你将会对这些命令有更深刻的理解。
如果你对计算机图形学还不太了解,那么请先从《OpenGL编程指南》一书入手学习,并同时参考下面这些书:?James D. Foley、 Andries van Dam、Steven K. Feiner和John F. Hughes著,《计算机图形学:原理及应用》(Computer Graphics rinciples and Practice)。
(Rea**,MA:Addision-Wesley)。
该书是一本计算机图形学的百科全书,它包含了丰富的信息量,但最好在你对这门学科有一定的实践经验之后再读它。
ナAndrew S. Glassner 著,《3D计算机图形学:艺术家与设计师的用户指南》(3D Computer Graphics: A User誷 Guide for Artists and Designers)。
(New York:Design Press)。
这是一本非技术性的、综合介绍计算机图形学的书,它着重于所能获得的视觉效果而非如何获取这些效果的具体技巧。
ナOlin Lathrop著,《计算机图形学的工作原理》(The Way Computer Graphics Work)。
(New York:John Wiley and Sons,Inc.)。
这本书概括性地介绍了计算机图形学,主要面向初级和中级计算机用户。
它介绍了理解计算机图形学所必需的一般概念。
0.2 字体约定本书使用如下的字体约定:黑体字(Bold)—命令和例行程序名;斜体字(Italics)—变量名、自变量名、参数名、空间维数和文件名;正体字(Regular)—枚举类型和定义的常量;等宽字体(Monospace font)—示例代码。
值得注意的是本书所使用的命令名称都是缩写形式。
许多OpenGL命令只是其他命令的变种。
简言之,这里只使用函数的基本名称。
如果此命令上加有星号(*),则说明它所代表的实际的命令名称可能比显示的命令名称要多。
如,glVertex*代表所有指定点的命令变种所构成的命令。
多数命令的区别仅在于它们所带的自变量的数据类型。
有些命令则在相关自变量的数目、这些自变量是否被指定为向量以及是否需在列表中单独指定等方面存在着区别。
例如,你使用glVertex2f命令时必须以浮点数形式提供x和y的坐标;而使用glVertex3sv 命令时你需为x,y,z提供一个包含三个短整型值的数组。
0.3 致谢本手册的初版是许多人共同努力的结果。
Silicon Graphics的Kurt Akeley,SABL Productions的Sally Browning以及Silicon Graphics的Kevin P. Smith为第1版提供了大量的资料,另外还有Jackie Neider和Mark Segal(他们均来自Silicon Graphics)。
Mark和Kurt合著《The OpenGL Graphics System:A Specification》,Kevin著《OpenGL Graphics System Utility Library》,Phil Karlton 著《OpenGL Graphics with the X Window System》为本书作者提供了文献来源。
Phil Karlton和Kipp Hickman帮助在Silicon Graphics定义并创建了OpenGL,此外还有Gain Technology, Inc.的Raymond Drewry、Digital Equipment Corp.的Fred Fisher、Kubota Pacific Computer, Inc.的Randi Rost 等人也为本书的编写提供了帮助。
OpenGL 结构评审委员会的成员Murray Cantor以及International Business Machines的Linas Vepstas、Digital Equipment Corporation 的Paula Womack和Jeff Lane、Intel的Murali Sundaresan,还有Microsoft的Chuck Whitmer 也提供了很多帮助。
Thad Beier同Seth Katz以及Silicon Graphics的Inventor小组一起制作了封面图形。
Silicon Graphics的Kay Maitz、Evans Technical Communications 的Arthur Evans以及Susan Blau提供了产品援助,Tanya Kucak对本手册进行了编辑。
当然,如果没有OpenGL,也就不会有本书的存在,所以要感谢Silicon Graphics的OpenGL 小组所有成员,感谢他们的辛勤工作。
他们是:Momi Akeley、Allen Akin、Chris Frazier、Bill Glazier、Paul Ho、Simon Hui、Lesley Kalmin、Pierre Tardif、Jim Winget,尤其是Wei Yen。
另外,还有上面提到的Kurt、Phil、Mark、Kipp以及Kevin。
当然还有许多其他的Slicon Graphics成员也为改进OpenGL的定义和功能做出了很多贡献,在这里也一并感谢他们。
Kempf的Renate Kempf及其同事、Silicon Graphics的Chris Frazier为《OpenGL Reference Manual for OpenGL, Version1.1》添加了所有OpenGL1.1 Specification中的新功能,并编辑审查了其他所有参考说明书。
下列人员对该书进行了仔细的复审,他们是Allen Akin、David Blythe、Craig Dunwoody、Chris Frazier以及Slicon Graphics的Paula Womack、OpenGL 结构评审委员会中的成员,包括Silicon Graphics的Kurt Akeley、HP的Dave Arns、E&S的Bill Armstrong、Intergraph的Dale Kirkland和IBM的Bimal Poddar。
Silicon Graphics的Simon Hui复审了GLX参考说明,John Spitzer复审了已校对的图形插页。
在本书中,SGI的Dave Shreiner添加了OpenGL 1.2和GLX 1.3的大部分新的功能,并在David Yu的帮助下重新修订了图面。
Norman Chin重新修订了GLU 1.3的参考说明。
下列人员认真地进行了手册复审这一艰巨的工作,他们是:Ron Bielaski、Steve Cunningham、Jeffery Galinovsky、Eric Haines、Mark Kilgard、Dale Kirkland、Seth Livingston、Bimal Poddar、David Nishimoto、Mike Schmitt、Scott Thompson、David Yu以及SGI的OpenGL小组的成员Craig Dunwoody、Jaya Kanajan、George Kyraizis、Jon Leech和Ken Nicholson。