mirror of
https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git
synced 2025-08-23 04:35:28 +08:00
Update readme
This commit is contained in:
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
<img alt="OpenGL Logo" src="http://learnopengl.com/img/getting-started/opengl.jpg" align="right" />
|
<img alt="OpenGL Logo" src="http://learnopengl.com/img/getting-started/opengl.jpg" align="right" />
|
||||||
|
|
||||||
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。
|
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。
|
||||||
|
|
||||||
实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,基本都是库的开发者留下的bug。
|
实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,基本都是库的开发者留下的bug。
|
||||||
|
|
||||||
@@ -19,17 +19,17 @@ OpenGL规范严格规定了每个函数该如何执行,以及它们的输出
|
|||||||
|
|
||||||
由于OpenGL的大多数实现都是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL,这也是为什么总是建议你偶尔更新一下显卡驱动。
|
由于OpenGL的大多数实现都是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL,这也是为什么总是建议你偶尔更新一下显卡驱动。
|
||||||
|
|
||||||
所有版本的OpenGL规范文档都被公开的寄存在Khronos那里。有兴趣的读者可以找到OpenGL3.3(我们将要使用的版本)的[规范文档](https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf)。如果你想深入到OpenGL的细节(只关心函数功能的描述而不是函数的实现),这是个很好的选择。如果你想知道每个函数**具体的**运作方式,这个规范也是一个很棒的参考。
|
所有版本的OpenGL规范文档都被公开的寄存在Khronos那里。有兴趣的读者可以找到OpenGL3.3(我们将要使用的版本)的[规范文档](https://www.opengl.org/registry/doc/glspec33.core.20100311.withchanges.pdf)。如果你想深入到OpenGL的细节(只关心函数功能的描述而不是函数的实现),这是个很好的选择。如果你想知道每个函数**具体的**运作方式,这个规范也是一个很棒的参考。
|
||||||
|
|
||||||
## 核心模式(Core-profile)与立即渲染模式(Immediate mode)
|
## 核心模式(Core-profile)与立即渲染模式(Immediate mode)
|
||||||
|
|
||||||
早期的OpenGL使用**立即渲染模式**(也就是**固定渲染管线**),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范书开始废弃立即渲染模式,推出核心模式,这个模式完全移除了旧的特性。
|
早期的OpenGL使用**立即渲染模式**(也就是**固定渲染管线**),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,推出核心模式,这个模式完全移除了旧的特性。
|
||||||
|
|
||||||
当使用OpenGl的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。现代函数的优势是更高的灵活性和效率,然而也更难于学习。立即渲染模式从OpenGL**实际**运作中抽象掉了很多细节,因而它易于学习的同时,也很难去把握OpenGL具体是如何运作的。现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。
|
当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。现代函数的优势是更高的灵活性和效率,然而也更难于学习。立即渲染模式从OpenGL**实际**运作中抽象掉了很多细节,因而它易于学习的同时,也很难去把握OpenGL具体是如何运作的。现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。
|
||||||
|
|
||||||
这也是为什么我们的教程面向OpenGL3.3的核心模式。虽然上手更困难,但是值得去努力。
|
这也是为什么我们的教程面向OpenGL3.3的核心模式。虽然上手更困难,但这份努力是值得的。
|
||||||
|
|
||||||
现今,更高版本的OpenGL已经发布(写作时最新版本为4.5),你可能会问:既然OpenGL 4.5 都出来了,为什么我们还要学习OpenGL 3.3?答案很简单,所有OpenGL的更高的版本都是在3.3的基础上,引入了额外的功能,并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此,所有的概念和技术在现代OpenGL版本里都保持一致。当你的经验足够,你可以轻松使用来自更高版本OpenGL的新特性。
|
现今,更高版本的OpenGL已经发布(写作时最新版本为4.5),你可能会问:既然OpenGL 4.5 都出来了,为什么我们还要学习OpenGL 3.3?答案很简单,所有OpenGL的更高的版本都是在3.3的基础上,引入了额外的功能,并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此,所有的概念和技术在现代OpenGL版本里都保持一致。当你的经验足够,你可以轻松使用来自更高版本OpenGL的新特性。
|
||||||
|
|
||||||
!!! Attention
|
!!! Attention
|
||||||
|
|
||||||
@@ -80,10 +80,10 @@ struct object_name {
|
|||||||
|
|
||||||
!!! Important
|
!!! Important
|
||||||
|
|
||||||
**基本数据类型(Primitive Type)**
|
**基元类型(Primitive Type)**
|
||||||
使用OpenGL时,建议使用OpenGL定义的基本数据类型。比如使用`float`时我们加上前缀`GL`(因此写作`GLfloat`)。`int`、`uint`、`char`、`bool`等等也类似。OpenGL定义的这些GL基本数据类型的内存布局是与平台无关的,而int等基本数据类型在不同操作系统上可能有不同的内存布局。使用GL基本数据类型可以保证你的程序在不同的平台上工作一致。
|
使用OpenGL时,建议使用OpenGL定义的基元类型。比如使用`float`时我们加上前缀`GL`(因此写作`GLfloat`)。`int`、`uint`、`char`、`bool`等等也类似。OpenGL定义的这些GL基元类型的内存布局是与平台无关的,而int等基元类型在不同操作系统上可能有不同的内存布局。使用GL基元类型可以保证你的程序在不同的平台上工作一致。
|
||||||
|
|
||||||
当我们使用一个对象时,通常看起来像如下一样(把OpenGL上下文看作一个大的结构体):
|
当我们使用一个对象时,通常看起来像如下一样(把OpenGL上下文看作一个大的结构体):
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
// OpenGL的状态
|
// OpenGL的状态
|
||||||
@@ -108,13 +108,13 @@ glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
|
|||||||
glBindObject(GL_WINDOW_TARGET, 0);
|
glBindObject(GL_WINDOW_TARGET, 0);
|
||||||
```
|
```
|
||||||
|
|
||||||
这一小段代码展现了你以后使用OpenGL时常见的工作流。我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子里窗口对象目标的位置被定义成`GL_WINDOW_TARGET`)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在`objectId`所引用的对象中,一旦我们重新绑定这个对象到`GL_WINDOW_TARGET`位置,这些选项就会重新生效。
|
这一小段代码展现了你以后使用OpenGL时常见的工作流。我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子中窗口对象目标的位置被定义成`GL_WINDOW_TARGET`)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在`objectId`所引用的对象中,一旦我们重新绑定这个对象到`GL_WINDOW_TARGET`位置,这些选项就会重新生效。
|
||||||
|
|
||||||
!!! Attention
|
!!! Attention
|
||||||
|
|
||||||
目前提供的示例代码只是OpenGL如何操作的一个大致描述,通过阅读以后的教程你会遇到很多实际的例子。
|
目前提供的示例代码只是OpenGL如何操作的一个大致描述,通过阅读以后的教程你会遇到很多实际的例子。
|
||||||
|
|
||||||
使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。比如说我们有一些作为3D模型数据(一栋房子或一个人物)的容器对象,在我们想绘制其中任何一个模型的时候,只需绑定一个包含对应模型数据的对象就可以了(当然,我们需要先创建并设置对象的选项)。拥有数个这样的对象允许我们指定多个模型,在想画其中任何一个的时候,直接将对应的对象绑定上去,便不需要再重复设置选项了。
|
使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。比如说我们有一些作为3D模型数据(一栋房子或一个人物)的容器对象,在我们想绘制其中任何一个模型的时候,只需绑定一个包含对应模型数据的对象就可以了(当然,我们需要先创建并设置对象的选项)。拥有数个这样的对象允许我们指定多个模型,在想画其中任何一个的时候,直接将对应的对象绑定上去,便不需要再重复设置选项了。
|
||||||
|
|
||||||
## 让我们开始吧
|
## 让我们开始吧
|
||||||
|
|
||||||
|
55
README.md
55
README.md
@@ -1,26 +1,59 @@
|
|||||||
# LearnOpenGL-CN
|
# LearnOpenGL中文化工程
|
||||||
|
|
||||||
learnopengl.com系列教程的中文翻译,目前正在翻译中。
|
learnopengl.com系列教程的中文翻译,目前正在翻译中。
|
||||||
|
|
||||||
**当前翻译进度:**
|
**英文原版**:[learnopengl.com](learnopengl.com)
|
||||||

|
|
||||||
|
|
||||||
|
**当前翻译进度**:
|
||||||
|
|
||||||
**现在可以认领一下In Practice了**
|
**目前状态**:请认领一下In Practice下的章节
|
||||||
|
|
||||||
## 如何认领翻译?
|
## 阅读地址
|
||||||
|
|
||||||
由于我们的志愿者来自五湖四海,为了避免冲突。请志愿者们先clone这个Repository 。同步到本地后找到要翻译的文章,创建一个如下所示的只包含作者、翻译者和原文链接信息的Markdown文件:
|
目前Host在Read The Docs上,可以[点击这里](http://learnopengl-cn.readthedocs.io/)进行阅读。
|
||||||
|
|
||||||
本文作者JoeyDeVries,由Geequlim翻译自http://learnopengl.com
|
## 认领翻译
|
||||||
|
|
||||||
|
由于我们的志愿者来自五湖四海,为了避免冲突。请志愿者们先Clone这个Repository 。同步到本地后找到要翻译的文章,创建一个如下所示的只包含作者、翻译者和原文链接信息的Markdown文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
原文 | [英文标题](原文地址)
|
||||||
|
---|---
|
||||||
|
作者 | JoeyDeVries
|
||||||
|
翻译 | [翻译]
|
||||||
|
校对 | 暂无
|
||||||
|
```
|
||||||
|
|
||||||
译文的文件命名统一规范为:
|
译文的文件命名统一规范为:
|
||||||
|
|
||||||
<两位数的章序列> <章名称>/<两位数节序列> 节名称/<两位数小节序列> 小节名称.md
|
```
|
||||||
|
<两位数的章序列> <章名称>/<两位数节序列> 节名称.md
|
||||||
|
```
|
||||||
|
|
||||||
|
如果有小节的话:
|
||||||
|
|
||||||
|
```
|
||||||
|
<两位数的章序列> <章名称>/<两位数节序列> 节名称/<两位数小节序列> 小节名称.md
|
||||||
|
```
|
||||||
|
|
||||||
例如:
|
例如:
|
||||||
|
|
||||||
05 Advanced Lighting/03 Shadows/02 Point Shadows.md
|
```
|
||||||
|
01 Getting started/01 OpenGL.md
|
||||||
|
或
|
||||||
|
05 Advanced Lighting/03 Shadows/02 Point Shadows.md
|
||||||
|
```
|
||||||
|
|
||||||
加入LearnOpenGL-CN组织,然后提交并push您的文章。
|
之后请联系我们,将您加入LearnOpenGL-CN组织,然后提交并Push您的翻译。或者您也可以Fork这个工程在本地编辑之后发送Pull Request。
|
||||||
|
|
||||||
### 欢迎志愿者们加入翻译组交流QQ群:383745868
|
## 建议
|
||||||
|
|
||||||
|
如果您发现文档有任何错误的话,欢迎Fork这个工程并发送Pull Request到 `master` 分支。如果您不想修改的话,可以点击页面上方的 `Issues` 按钮提交一个Issue,我们看到后会及时更正。
|
||||||
|
|
||||||
|
## 样式指南
|
||||||
|
|
||||||
|
在文档的写作过程中,请遵守我们的[样式指南](https://github.com/LearnOpenGL-CN/LearnOpenGL-CN/blob/master/styleguide.md)方便之后的校对以及修改工作。
|
||||||
|
|
||||||
|
## 联系方式
|
||||||
|
|
||||||
|
QQ群:383745868
|
@@ -30,7 +30,7 @@
|
|||||||
```
|
```
|
||||||
原文 | [英文标题](原文地址)
|
原文 | [英文标题](原文地址)
|
||||||
---|---
|
---|---
|
||||||
作者 | [作者]
|
作者 | JoeyDeVries
|
||||||
翻译 | [翻译]
|
翻译 | [翻译]
|
||||||
校对 | [校对]
|
校对 | [校对]
|
||||||
```
|
```
|
||||||
@@ -53,6 +53,7 @@ xxxx(([译注x])
|
|||||||
效果会像这样([译注1])
|
效果会像这样([译注1])
|
||||||
|
|
||||||
- “Additional resources”译作“附加资源”,“Exercises”译作“练习”,“Solution”译作“参考解答”
|
- “Additional resources”译作“附加资源”,“Exercises”译作“练习”,“Solution”译作“参考解答”
|
||||||
|
- 必要时可以使用HTML代码
|
||||||
|
|
||||||
**如果有不全的继续加**
|
**如果有不全的继续加**
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user