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

第一节搞定呼

This commit is contained in:
gjy_管
2015-06-15 21:37:09 +08:00
parent a9e9909838
commit 5ac42f9c24

View File

@@ -5,7 +5,7 @@
未翻译完成... 未翻译完成...
--- ---
在进行这段旅程之前我们先解释下OpenGL到底是什么。它一般被认为是一个应用程序编程接口API包含了一系列可以操作图形、画像的方法。然而OpenGL本身并不是一个API仅仅是一个规范由[Khronos组织](http://www.khronos.org/)制定并维护。 在进行这段旅程之前我们先解释下OpenGL到底是什么。它一般被认为是一个**应用程序编程接口**API包含了一系列可以操作图形、画像的方法。然而OpenGL本身并不是一个API仅仅是一个规范由[Khronos组织](http://www.khronos.org/)制定并维护。
OpenGL规范严格规定了每个函数该如何执行以及它们该如何返回。至于内部具体每个函数是如何实现的将由openGL库的开发者自行决定这里开发者是指编写OpenGL库的人。因为OpenGL规范并没有规定实现的细节具体的OpenGL库允许使用不同的实现只要其功能和结果与规范相匹配亦即作为用户不会感受到功能上的差异 OpenGL规范严格规定了每个函数该如何执行以及它们该如何返回。至于内部具体每个函数是如何实现的将由openGL库的开发者自行决定这里开发者是指编写OpenGL库的人。因为OpenGL规范并没有规定实现的细节具体的OpenGL库允许使用不同的实现只要其功能和结果与规范相匹配亦即作为用户不会感受到功能上的差异
@@ -46,11 +46,11 @@ OpenGL的一大特性就是对扩展的支持当一个显卡公司提出一
```c++ ```c++
if(GL_ARB_extension_name) if(GL_ARB_extension_name)
{ {
// Do cool new and modern stuff supported by hardware // 使用一些新的特性
} }
else else
{ {
// Extension not supported: do it the old way // 不支持此扩展: 用旧的方式去做
} }
``` ```
@@ -58,11 +58,11 @@ OpenGL的一大特性就是对扩展的支持当一个显卡公司提出一
##状态机 ##状态机
OpenGL自身是一个巨大的状态机一个描述OpenGL该如何操作的所有变量的大集合。OpenGL的状态通常被称为OpenGL上下文context。我们通常使用如下途径去更改OpenGL状态设置一些选项操作一些缓存。最后我们使用当前OpenGl上下文来渲染。 OpenGL自身是一个巨大的状态机一个描述OpenGL该如何操作的所有变量的大集合。OpenGL的状态通常被称为OpenGL**上下文**context。我们通常使用如下途径去更改OpenGL状态设置一些选项操作一些缓存。最后我们使用当前OpenGl上下文来渲染。
假设当我们想告诉OpenGL去画线而不是三角形的时候我们通过改变一些上下文变量来改变OpenGL状态从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段下一个绘制命令就会画出线段而不是三角形。 假设当我们想告诉OpenGL去画线而不是三角形的时候我们通过改变一些上下文变量来改变OpenGL状态从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段下一个绘制命令就会画出线段而不是三角形。
用OpenGL工作时我们会遇到一些改变OpenGL工作状态的函数state-changing function以及一些在这些状态的基础上执行操作的函数state-using function。只要你记住OpenGL本质上是个大状态机就能更容易理解它的大部分特性。 用OpenGL工作时我们会遇到一些**改变OpenGL工作状态的函数**state-changing function以及一些在这些状态的基础上**执行操作的函数**state-using function。只要你记住OpenGL本质上是个大状态机就能更容易理解它的大部分特性。
##对象Object ##对象Object
@@ -78,3 +78,52 @@ OpenGL库是用C写的同时也支持多种语言的派生但是核心是
}; };
``` ```
<div style="border:solid #AFDFAF;border-radius:10px;background-color:#D8F5D8;margin:10px 10px 10px 0px;padding:10px">
<span style="font-size:20px"><b>原始类型</b></span>
<br/>
使用OpenGL时建议使用OpenGL定义的原始类型。比如使用float时我们加上前缀GL因此写作GLfloat。intuintcharbool等等类似。OpenGL定义了这些GL原始类型的平台无关的内存排列方式。而int等原始类型在不同平台上可能有不同的内存排列方式。使用GL原始类型可以保证你的程序在不同的平台上工作一致。
</div>
当我们使用一个对象时通常看起来像如下一样把OpenGL上下文比作一个大的结构体
```c++
// OpenGL状态
struct OpenGL_Context {
...
object* object_Window_Target;
...
};
```
```c++
// 创建一个对象
GLuint objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置GL_WINDOW_TARGET对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文的GL_WINDOW_TARGET对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);
```
这一小片代码将会是以后使用OpenGl时常见的工作流。我们首先创建一个对象然后用一个id保存它的引用实际数据被储存在后台。然后我们将对象绑定至上下文的目标位置例子里窗口对象的目标位置被定义成GL\_WINDOW\_TARGET。接下来我们设置窗口的选项最后我们解绑这个对象通过将目标位置的对象id设回0。我们设置的选项被保存在objectId代表的对象中一旦我们重新绑定这个对象到GL\_WINDOW\_TARGET位置这些选项就会重新生效。
<div style="border:solid #E1B3B3;border-radius:10px;background-color:#FFD2D2;margin:10px 10px 10px 0px;padding:10px">
目前提供的示例代码只是OpenGL如何操作的一个大致描述通过教程你会遇到很多实际的例子。
</div>
使用对象的一个好事是我们在程序中可以定义不止一个对象设置他们的选项当我们需要进行一个操作的时候只需要绑定预设了需要的状态的对象。比如有作为3D模型数据一栋房子或一个人物容器对象的对象任何时候我们想绘制其中一个3D模型的时候只需绑定相应的含模型数据的对象我们预先创建并设置好了它们的选项。拥有数个这样的对象允许我们指定多个模型在想画其中任何一个的时候简单的将相应的对象绑定上去不需要进行重复的设置选项的操作。
##让我们开始吧
你现在已经知道一些OpenGL的相关知识了包括OpenGL作为规范和库OpenGL大致的操作流程以及一些使用扩展的小技巧。不要担心没有完全消化它们通过这个教程我们会仔细讲解每一步你会通过足够的例子来把握OpenGL。如果你已经做好了下一步的准备我们可以开始建立OpenGL上下文以及我们的第一个窗口了。[点击这里](http://www.learnopengl.com/#!Getting-started/Creating-a-window)(第一章第二节)
##额外的资源
- [opengl.org](https://www.opengl.org/): OpenGL官方网站.
- [OpenGL registry](https://www.opengl.org/registry/): OpenGL各版本的规范和扩展的主站。