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 函数时, 会设置一个错误标志. 这种情况下, 函数不做任何事情, 你得不到你想要的结果, 这时查看错误状态会给你的调试提供非常重要的帮助.
返回值见下标所示. 错误值记录了从程序启动或上次调用 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
2022年9月25日 15:21
Candidates who to know the examination pattern or question paper style and want topic wise important questions for all subjects, NCERT Term 1 Question Paper Class 10 with those candidates in mind here we supplied the NCERT Term-1 Sample Paper 2023 Class 10 for Session exams of SA, Candidates who to know the examination pattern or question paper style and want topic wise important questions for all subjectsFA and Assignments of all subjects and languages as per the newly revised syllabus & curriculum.Candidates who to know the examination pattern or question paper style and want topic wise important questions for all subjects
2023年7月23日 23:20
Es ist erstaunlich, wie viele Standortdaten wir bereitwillig an Google weitergeben. Die Timeline-Funktion von Google macht es einfach, all diese Daten auf einen Blick zu sehen. maps verlauf löschen Jeder kann Ihren Google Maps-Standortverlauf in der Timeline sehen, zusammen mit zusätzlichen Informationen, z. B. wie Sie dorthin gekommen sind und wie viel Zeit Sie dort verbracht haben.
2024年1月19日 23:19
Pavzi.com is a startup by passionate webmasters and bloggers who have a passion for providing engaging content that is accurate, interesting, and worthy to read. pavzi.com We are more like a web community where you can find different information, resources, and topics on day-to-day incidents or news. We provide you with the finest web content on every topic possible with the help of the editorial and content team.