OpenGl 游戏编程笔记 第二章: 创建一个简单的 OpenGL 程序
OpenGl 游戏编程笔记 第三章: OpenGL 状态和图元 (二)

OpenGl 游戏编程笔记 第三章: OpenGL 状态和图元 (一)

皮贝贝 posted @ 2010年3月27日 16:34 in opengl with tags 游戏 OpenGL game , 3542 阅读

OpenGl 游戏编程笔记 第三章: OpenGL 状态和图元 (一)

本章可以学到:

  • 怎样访问 OpenGL 状态机
  • OpenGL 可用的图元种类
  • 怎样控制图元处理和显示的方式

1 状态相关函数

OpenGL 提供了一些不同目的函数来访问状态机, 这些函数大多数以 glGet 为前缀. 本节将涉及 大多数常见的, 其余的特殊不常用的函数会在本书的其他部分见到.

本节介绍的此类函数需要你准备一个渲染上下文, 否则他们将会返回一个不确定的值.

1.1 查询数值状态

主要有 4 个相关的函数:


void glGetBooleanv(GLenum pname, GLboolean *params);
void glGetDoublev(GLenum pname, GLdouble *params);
void glGetFloatv(GLenum pname, GLfloat *params);
void glGetIntegerv(GLenum pname, GLint *params);

每个函数原型中, 参数 pname 指的是你要查询的状态设置, 参数 params 是一个足够保存所有状态的值的数组. 鉴于状态过多, 我们不可能面面俱到, 只在出现的地方给予解释.

当然, 感兴趣最多的还是访问查询这些状态设置, 而不是更改. 所以 OpenGL 中没有 glSet() 之类的设置状态值的函数. 不过有一些非常特殊的函数, 我们将 在以后讲到.

1.2 启用和关闭状态.

我们已经知道了如何查询状态, 但是怎样将状态打开和关闭呢? 主要是这两个函数:


void glEnable(GLenum cap);
void glDisable(GLenum cap);

参数 cap 指的是你要启用或关闭的 OpenGL 性能. glEnable() 用来开启, glDisable() 用来关闭. OpenGL 大约有 40 多个可以自由开启和关闭的性能. 像 GL_BLEND([TODO]), GL_TEXTURE_2D(2D文字显示), GL_LIGHTING([TODO]). 阅完本书, 你会学到很多用这些函数 来自由开启的性能.

1.3 glIsEnabled()

很多时候, 我们只是想知道某些性能是否开启.虽然 glGetBooleanv() 可以完成我们想要的工作, 但是 glIsEnabled() 使用起来更方便:


GLBoolean glIsEnabled(GLenum cap);

glEnable() / glDisable() 的参数可以座位 glIsEnabled() 的参数来查询. 性能开启返回 GL_TRUE, 否则返回 GL_FALSE.

1.4 查询字符串

你会发现在 OpenGL 的实现细节中经常用到下面这个函数:

const GLubyte *glGetString(GLenum name);

这个函数返回与 name 相关的一个C类型零结尾字符串. 参数 name 可以是以下几种:


参数 描述
GL_VENDOR 返回的字符串是你使用的OpenGL的实现厂商. 例如, ATI 驱动的生产厂商是 ATI Technologies Inc.
GLRENDERER 返回硬件信息.例如, 我的机器上返回 "REDEON 9800 Pro x86/MMX/3DNow!/SSE".
GL_VERSION 返回版本信息.格式可能是 "主版本号.次版本号", 或者 "主版本号.次版本号.正式版本号", 可能后面还会有生产厂商自行添加的额外信息. 我的机器上返回 "1.3.4010 Win2000 Release".
GL_EXTENSIONS 返回空格分割的 OpenGL 扩展列表. 在滴 8 章将会详细介绍
编程小提示:

glGetString() 返回 OpenGL 实现的硬件信息, 你需要小心你使用的方式. 我见过很多编程新手
用这个函数来判断是否启用某些渲染特效. 例如, 他们知道有一项功能是 Nvidia GeForce 早期的
显卡独有的, 他们会检测返回的 RENDER 字符串是否是 "geforce" , 如果不是会禁用此项功能. 
这是一个非常糟糕的做法, 好的做法是在游戏第一次运行时来配置, 在检测到硬件改变时再重新配置.

1.5 查找错误

当用一个错误的值给 OpenGL 函数时, 会设置一个错误标志. 这种情况下, 函数不做任何事情, 你得不到你想要的结果, 这时查看错误状态会给你的调试提供非常重要的帮助.


GLenum glGetError();

返回值见下标所示. 错误值记录了从程序启动或上次调用 glGetError() 开始的第一个错误. 换句话说, 当一个错误发生后, 这个错误标志就不在改变了, 直到你调用 glGetError(). 调用这个函数后, 错误标志会重置为 GL_NO_ERROR.


描述
GL_NOERROR 没有错误, 这时我们所希望看到的
GL_INVALID_ENUM 你传入了一个 OpenGL 函数不接受的 参数
GL_INVALID_VALUE 你使用了在可接受范围之外的数值
GL_INVALID_OPERATION 比之上面两个错误更难跟踪. 可能是传入函数的参数的值(位集合)的几个标志不能同时工作, 或是你的操作在当前的状态配置下不可用.
GL_STACK_OVERFLOW OpenGL中有很多你可以自己操作的栈, 最常见的就是 矩阵栈. 当函数调用产生栈溢出时候出现此错误
GL_STACK_UNDERFLOW 同上, 在出现栈下溢时出错. 常常是由 pop 多于 push 引起.
GL_OUT_OF_MEMORY 你的操作引起系统内存用尽. 不同与其他错误, 这可能会修改 OpenGL 的内部状态. 这是未知的, 所以一旦出现此错误, 应该退出
GL_TABLE_TOO_LARGE 错误不常见, 尤其在游戏中.

1.6 给 OpenGL 一些建议

OpenGL 允许你控制画质和速度. glHint() 让你可以在画质和速度上做一个取舍, 来控制大量不同的 OpenGL 行为.


void glHint(GLenum target, GLenum hint);

参数 target 指定了你想控制的行为. 尽管如此, 你不必对每种行为深入研究. 所有可控的行为列在下表. 参数 hint 制定了你要控制的级别, 可以是三种选项: GL_FASTEST, GL_NICEST, 或者 GL_DONT_CARE. GL_FASTEST 以速度优先,可能有损画质. GL_NICEST 注重画质,可能损失性能. GL_DONT_CARE 是说你不关心, 有 OpenGL 内部自行决定调整.


参数 描述
GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT, GL_POLYGON_SMOOTH_HINT 反锯齿期间指定的点,线,或多边形抽样质量
GL_FOG_HINT 若指定 GL_NICEST 会在每个像素点进行雾计算, 若指定 GL_FASTEST, 则会在 每个顶点进行雾计算
GL\PERSPECTIVE_CORRECTION_HINT 色彩和纹理贴图坐标差值

 

Date: 2010-03-27 08:22:52

HTML generated by org-mode 6.30c in emacs 23


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter