1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 04:35:28 +08:00

Continue tweaking 01-01 to make it easier to understand

This commit is contained in:
Meow J
2016-07-04 00:04:34 +08:00
parent c39cd562e7
commit 84d7e37ab0

View File

@@ -7,18 +7,16 @@
校对 | Geequlim
在开始这段旅程之前我们先了解一下OpenGL到底是什么。一般它被认为是一个**API**(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的方法。然而OpenGL本身并不是一个API它仅仅是一个由[Khronos组织](http://www.khronos.org/)制定并维护的规范(Specification)。
在开始这段旅程之前我们先了解一下OpenGL到底是什么。一般它被认为是一个API(**Application Programming Interface**, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而OpenGL本身并不是一个API它仅仅是一个由[Khronos组织](http://www.khronos.org/)制定并维护的规范(Specification)。
OpenGL规范严格规定了每个函数该如何执行以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的将由OpenGL库的开发者自行决定(注这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节具体的OpenGL库允许使用不同的实现只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。
实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候OpenGL库是由Apple自身维护的。在Linux下有显卡生产商提供的OpenGL库也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时基本都是库的开发者留下的bug。
!!! Important
由于OpenGL的大多数实现都是由显卡厂商编写的当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL这也是为什么总是建议你偶尔更新一下显卡驱动。
所有版本的OpenGL规范文档都被公开的寄存在Khronos那里。有兴趣的读者可以找到OpenGL3.3(我们将要使用的版本)的[规范文档](https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf)。如果你想深入到OpenGL的细节(只关心函数功能的描述而不是函数的实现),这是个很好的选择。如果你想知道每个函数**具体的**运作方式,这个规范也是一个很棒的参考。
## 核心模式(Core-profile)与立即渲染模式(Immediate mode)
@@ -35,7 +33,7 @@ OpenGL规范严格规定了每个函数该如何执行以及它们的输出
当使用新版本的OpenGL特性时只有新一代的显卡能够支持你的应用程序。这也是为什么大多数开发者基于较低版本的OpenGL编写程序并只提供选项启用新版本的特性。
在有些教程里你会看见更现代的特性,它们会以这种色注释方式标明。
在有些教程里你会看见更现代的特性,它们同样会以这种色注释方式标明。
## 扩展(Extension)
@@ -101,7 +99,7 @@ GLuint objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置绑定到GL_WINDOW_TARGET的对象的一些选项
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
@@ -110,18 +108,17 @@ glBindObject(GL_WINDOW_TARGET, 0);
这一小段代码展现了你以后使用OpenGL时常见的工作流。我们首先创建一个对象然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子里窗口对象目标的位置被定义成`GL_WINDOW_TARGET`)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0解绑这个对象。设置的选项将被保存在`objectId`所引用的对象中,一旦我们重新绑定这个对象到`GL_WINDOW_TARGET`位置,这些选项就会重新生效。
!!! Attention
目前提供的示例代码只是OpenGL如何操作的一个大致描述通过阅读以后的教程你会遇到很多实际的例子。
使用对象的一个好处是在程序中,我们不止可以定义一个对象,设置它们的状态。在我们执行一个使用OpenGL状态的操作的时候只需要绑定对象到需要的设置即可。比如有一些作为3D模型数据(一栋房子或一个人物)的容器对象,在我们想绘制其中任何一个对象的时候,只需绑定一个对象包含相应的模型数据就可以了(先创建并设置对象的选项)。拥有数个这样的对象允许我们指定多个模型,在想画其中任何一个的时候,直接将对应的对象绑定上去,便不需要再重复设置选项了。
使用对象的一个好处是在程序中,我们不止可以定义一个对象,设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候只需要绑定含有需要的设置的对象即可。比如说我们有一些作为3D模型数据(一栋房子或一个人物)的容器对象,在我们想绘制其中任何一个模型的时候,只需绑定一个包含对应模型数据的对象就可以了(当然,我们需要先创建并设置对象的选项)。拥有数个这样的对象允许我们指定多个模型,在想画其中任何一个的时候,直接将对应的对象绑定上去,便不需要再重复设置选项了。
## 让我们开始吧
你现在已经知道一些OpenGL的相关知识了OpenGL规范和库OpenGL幕后大致的运作流程以及OpenGL使用的一些技巧。不要担心你还没有完全消化它们后面的教程我们会仔细地讲解每一个步骤你会通过足够的例子来真正掌握OpenGL。如果你已经做好了开始下一步的准备我们可以在[这里](02 Creating a window.md)开始建OpenGL上下文以及我们的第一个窗口了。
你现在已经知道一些OpenGL的相关知识了OpenGL规范和库OpenGL幕后大致的运作流程以及OpenGL使用的一些传统技巧。不要担心你还没有完全消化它们后面的教程我们会仔细地讲解每一个步骤你会通过足够的例子来真正掌握OpenGL。如果你已经做好了开始下一步的准备我们可以在[这里](02 Creating a window.md)开始建OpenGL上下文以及我们的第一个窗口了。
## 附加资源
- [opengl.org](https://www.opengl.org/)OpenGL官方网站。
- [OpenGL registry](https://www.opengl.org/registry/)包含OpenGL各版本的规范和扩展。
- [OpenGL registry](https://www.opengl.org/registry/)包含OpenGL各版本的规范和扩展。