mirror of
https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git
synced 2025-08-23 04:35:28 +08:00
第一节搞定呼
This commit is contained in:
@@ -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)。int,uint,char,bool等等类似。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各版本的规范和扩展的主站。
|
Reference in New Issue
Block a user