您的位置:首页 > 运维架构

OpenGL学习(1)-基础知识(3)

2013-06-28 23:39 253 查看
OpenGL特性

OpenGL被定义为 图形硬件的一种软件接口,本质上是一个3D图形和模型库,具有高度可移植性,速度远远快于光线追踪器或软件渲染引擎。

OpenGL扩展机制

OpenGL允许提供商通过它的扩展机制进行创新。

使用OpenGL

OpenGL是一种过程性而不是描述性的图形API, 程序员并不需要描述场景和它的外观,而是事先确定一些操作步骤,实现一定的外观或效果。OpenGL并不包含任何负责窗口管理、用户交互或是文件I/O的函数,每个宿主环境提供一些函数实现这些功能,并负责实现一些方法,向OpenGL移交窗口绘图的控制。

GLUT

GLUT代表OpenGL实用工具箱(OpenGL utility toolkit),不同于GLU(OpenGL utility library,OpenGL实用库)。

Windows中GLUT的开发已中断,由freeglut取代,所有基于GLUT的Windows实例程序都利用了freeglut函数库。

使用GLUT可以不必了解任何特定平台的基本GUI编程,我们不能依赖GLUT来完成应用程序的所有任务,但GLUT是非常优秀的学习和演示工具,隐藏了窗口创建和OpenGL环境初始化等平台特定的细节。

GLEW

GLEW(The OpneGL Extension Wrangler Library) ,GLEW is a simple tool that help C/C++ developers initialize extensions and write portalbe applications.

OpenGL API主要通过扩展机制来发展,这种扩展机制能够用来获得指向任何加入OpenGL 1.0之后任何版本核心的OpenGL函数的函数指针,有一个实现OpenGL 3.3 API完全存取的简单方法,就是使用一个 自动初始化 所有新函数指针 并 包含所需类型定义、常量和枚举值的扩展加载库,不止一种这样的扩展加载库可供选择,其中一种维护最好的开源库是GLEW。

GLEW被预先封装在了GLTools库中,GLTools库就是基于GLEW库的。

GLTools

一些有用并且可重用的函数,所有程序员在编写几乎所有OpenGL时都要用到。

GLTools包含一个用于操作矩阵和向量的3D数学库,并依靠GLEW获得OpenGL 3.3 中用来产生和渲染一些简单3D对象的函数,以及对视觉平截头体、相机类和变换矩阵进行管理的函数的充分支持。

OpenGL数据类型

为使OpenGL代码更易于从一个平台移植到另一平台,OpenGl定义了数据类型,这些数据类型可以映射到所有平台上的特定最小格式。

使用OpenGL定义的变量类型,可以使代码避免因为类型在变量表示上不一致所带来的影响。

OpenGL变量类型和最小位宽

OpenGL数据类型
最小位宽 描述

GLboolean
1 布尔值,真或假

GLbyte
8 有符号8位整数

GLubyte
8 无符号8位整数

GLuchar
8 字符串

GLshort
16 有符号16位整数

GLushort
16 无符号16位整数

GLhalf
16 半精度浮点值

GLint
32 有符号32位整数

GLuint
32 无符号32位整数

GLsizei
32 无符号32位整数

GLenum
32 无符号32位整数

GLfloat
32 32位浮点数

GLclampf
32 [0,1]范围内的32位浮点数

GLbitfield
32 32位

GLdouble
64 64位双精度数

GLclampd
64 [0,1]范围内的64位浮点数

GLint64
64 有符号64位整数

GLuint64
64 无符号64位整数

GLsizeiptr
本地指针大小 无符号整数

GLintptr
本地指针大小 有符号整数

GLsync
本地指针大小 同步对象句柄

所有数据类型都以GL开头,表示OpenGL,OpenGL规范要求的最小存储空间见表,虽然某些数值超出表中范围是可能的,但只有大小在指定范围内的数值对OpenGL来说才是有意义的

有些是更具描述性的名称,如size表示一个数值长度或者深度,GLsizei 是一个OpenGL变量类型,表示整数形式的size参数。

clamp表示这个值的范围将“截取”在0.0~1.0范围内。

GLboolen表示真假。

GLenum表示枚举变量

GLbitfield表示那些包含二进制位段的变量。

OpenGL错误

OpenGL内部保留了一组错误标识,共4个,每个标识代表一种不同类型错误。

可调用glGetError函数,观察哪些标识被设置

GLenum glGetError(void);

如果被设置的标识不止一个,glGetError仍然只返回一个唯一值,当函数被调用时候,这个值随后被清除,然后在再次被调用时返回错误标识或GL_NO_EOORO,通常,我们在一个循环中调用glGetError函数,持续检查错误标识,直到返回GL_NO_ERROR

OpenGL错误代码

错误代码
描述

GL_INVALID_ENUM
枚举参数超出范围

GL_INVALID_VALUE
数值参数超出范围

GL_INVALID_OPERATION
当前状态操作非法

GL_OUT_OF_MEMORY
没有足够内存来执行这条命令

GL_NO_ERROR
没有错误

如果一个错误是由于对OpenGL的非法调用所致,这条命令或函数调用将会被忽略就,但接受指向内存的指针作为参数的函数可能会由于指针无效导致崩溃。

确认版本

查询OpenGL的渲染引擎(OpenGl驱动程序)的生产商和版本号,调用glGetString来返回与它们的版本号和生产商有关信息。

const GLubyte *glGetString(GLenum name) ;

函数返回一个静态字符串,描述GL函数库中所请求信息。

glHint

一种OpenGl实现常包含两种方法执行一个特定任务,一种是快速方法,在性能上稍妥协;另一种是慢速方法,着重改进视觉质量。

glHint函数允许我们指定偏重于视觉质量还是速度,以适应不同类型操作需求。

void glHint( GLenum target, GLenum mode) ;

target参数指定希望进行修改的行为类型,mode参数告诉OpenGL最关心的是质量还是速度,或是并不关心,使用默认行为。

注:所有OpenGL实现都不要求必须在glHint函数调用上保持一致,是OpenGl中唯一一个行为完全依赖生厂商的函数。

OpenGL状态机

影响几何图形绘制的变量的集合称为 管线的状态。

状态机是一个抽象的模型,表示一组状态变量的集合,每个状态变量可以有各种不同的值,或只能打开或关闭。

OpenGL使用了一种状态模型(或称状态机)来追踪所有的OpenGL状态变量,当一个状态呗设置之后,它就一直保持这个状态,直到其它函数对它进行修改为止

如,深度测试要不打开,要么关闭,打开深度测试的几何绘图将会 被检查 以确保在进行渲染之前 总会在任何位于它后面的对象 前方;深度测试关闭后进行的几何图形绘制,则会在不进行深度比较的情况下进行绘制。

void glEnalbe( GLenum capability ) ;
打开状态变量

void glDisable( GLenum capability ) ;
把状态设置为关闭 如void glEnalbe(GL_DEPTH_TEST);

GLboolean glIsEnalbe( GLenum capability ) ;
测试状态变量是否打开

许多OpenGL可设置变量的值,设置后一直保持,直到再次被修改,可以在任何时候查询状态的值,可以查询布尔型、整形、单精度浮点型、双精度浮点型的变量值

函数原型如下

void glGetBooleanv( GLenum pname, GLboolean *params ) ;

void glGetDoublev( GLenum pname, GLdouble *params) ;

void glGetFloatv( Glenum pname, GLfloat, *params) ;

void glGetIntegerv( GLenum pname, GLint *params) ;

每个函数返回单个值,或是一个数组,把一些值存储到指定的地址中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: