mirror of
https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git
synced 2025-08-23 04:35:28 +08:00
Update sytle guide
This commit is contained in:
@@ -15,7 +15,7 @@ OpenGL规范严格规定了每个函数该如何执行,以及它们的输出
|
|||||||
|
|
||||||
实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,基本都是库的开发者留下的bug。
|
实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,基本都是库的开发者留下的bug。
|
||||||
|
|
||||||
!!! Important
|
!!! important
|
||||||
|
|
||||||
由于OpenGL的大多数实现都是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL,这也是为什么总是建议你偶尔更新一下显卡驱动。
|
由于OpenGL的大多数实现都是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL,这也是为什么总是建议你偶尔更新一下显卡驱动。
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ OpenGL规范严格规定了每个函数该如何执行,以及它们的输出
|
|||||||
|
|
||||||
现今,更高版本的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
|
||||||
|
|
||||||
当使用新版本的OpenGL特性时,只有新一代的显卡能够支持你的应用程序。这也是为什么大多数开发者基于较低版本的OpenGL编写程序,并只提供选项启用新版本的特性。
|
当使用新版本的OpenGL特性时,只有新一代的显卡能够支持你的应用程序。这也是为什么大多数开发者基于较低版本的OpenGL编写程序,并只提供选项启用新版本的特性。
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ 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基元类型可以保证你的程序在不同的平台上工作一致。
|
||||||
@@ -110,7 +110,7 @@ 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如何操作的一个大致描述,通过阅读以后的教程你会遇到很多实际的例子。
|
||||||
|
|
||||||
|
@@ -24,9 +24,11 @@
|
|||||||
|
|
||||||
如你所见,图形渲染管线包含很多部分,每个都是将你的顶点数据转变为最后渲染出来的像素这个大过程中的一个特定阶段。我们会概括性地解释渲染管线的每个部分,从而使你对图形渲染管线的工作方式有个大概了解。
|
如你所见,图形渲染管线包含很多部分,每个都是将你的顶点数据转变为最后渲染出来的像素这个大过程中的一个特定阶段。我们会概括性地解释渲染管线的每个部分,从而使你对图形渲染管线的工作方式有个大概了解。
|
||||||
|
|
||||||
我们以数组的形式传递3个3D坐标作为图形渲染管线的输入,它用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);这里顶点数据是一些顶点的集合。一个**顶点**是一个3D坐标的集合(也就是x、y、z数据)。而顶点数据是用**顶点属性**(Vertex Attributes)表示的,它可以包含任何我们希望用的数据,但是简单起见,我们还是假定每个顶点只由一个3D位置([译注1])和几个颜色值组成的吧。
|
我们以数组的形式传递3个3D坐标作为图形渲染管线的输入,它用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);这里顶点数据是一些顶点的集合。一个**顶点**是一个3D坐标的集合(也就是x、y、z数据)。而顶点数据是用**顶点属性**(Vertex Attributes)表示的,它可以包含任何我们希望用的数据,但是简单起见,我们还是假定每个顶点只由一个3D位置(译注1)和几个颜色值组成的吧。
|
||||||
|
|
||||||
[译注1]: http://learnopengl-cn.readthedocs.org "译注:当我们谈论一个“位置”的时候,它代表在一个“空间”中所处地点的这个特殊属性;同时“空间”代表着任何一种坐标系,比如x、y、z三维坐标系,x、y二维坐标系,或者一条直线上的x和y的线性关系,只不过二维坐标系是一个扁扁的平面空间,而一条直线是一个很瘦的长长的空间。"
|
!!! note "译注1"
|
||||||
|
|
||||||
|
当我们谈论一个“位置”的时候,它代表在一个“空间”中所处地点的这个特殊属性;同时“空间”代表着任何一种坐标系,比如x、y、z三维坐标系,x、y二维坐标系,或者一条直线上的x和y的线性关系,只不过二维坐标系是一个扁扁的平面空间,而一条直线是一个很瘦的长长的空间。
|
||||||
|
|
||||||
!!! Important
|
!!! Important
|
||||||
|
|
||||||
@@ -69,9 +71,11 @@ GLfloat vertices[] = {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
由于OpenGL是在3D空间中工作的,我们渲染一个2D三角形,它的每个顶点都要有同一个z坐标0.0。在这样的方式中,三角形的每一处的深度(Depth, [译注2])都一样,从而使它看上去就像2D的。
|
由于OpenGL是在3D空间中工作的,我们渲染一个2D三角形,它的每个顶点都要有同一个z坐标0.0。在这样的方式中,三角形的每一处的深度(Depth, 译注2)都一样,从而使它看上去就像2D的。
|
||||||
|
|
||||||
[译注2]: http://learnopengl-cn.readthedocs.org "通常深度可以理解为z坐标,它代表一个像素在空间中和你的距离,如果离你远就可能被别的像素遮挡,你就看不到它了,它会被丢弃,以节省资源。"
|
!!! note "译注2"
|
||||||
|
|
||||||
|
通常深度可以理解为z坐标,它代表一个像素在空间中和你的距离,如果离你远就可能被别的像素遮挡,你就看不到它了,它会被丢弃,以节省资源。
|
||||||
|
|
||||||
!!! Important
|
!!! Important
|
||||||
|
|
||||||
|
@@ -279,9 +279,9 @@ direction.z = cos(glm::radians(pitch));
|
|||||||
|
|
||||||
就像俯仰角一样我们可以看到x元素取决于cos(偏航角)的值,z值同样取决于偏航角的正弦值。把这个加到前面的值中,会得到基于俯仰角和偏航角的方向向量:
|
就像俯仰角一样我们可以看到x元素取决于cos(偏航角)的值,z值同样取决于偏航角的正弦值。把这个加到前面的值中,会得到基于俯仰角和偏航角的方向向量:
|
||||||
|
|
||||||
!!! Important
|
!!! note "译注"
|
||||||
|
|
||||||
译注:这里的球坐标与笛卡尔坐标的转换把x和z弄反了,如果你去看最后的源码,会发现作者在摄像机源码那里写了`yaw = yaw – 90`,实际上在这里x就应该是`sin(glm::radians(yaw))`,z也是同样处理,当然也可以认为是这个诡异的坐标系,但是在这里使用球坐标转笛卡尔坐标有个大问题,就是在初始渲染时,无法指定摄像机的初始朝向,还要花一些功夫自己实现这个;此外这只能实现像第一人称游戏一样的简易摄像机,类似Maya、Unity3D编辑器窗口的那种摄像机还是最好自己设置摄像机的位置、上、右、前轴,在旋转时用四元数对这四个变量进行调整,才能获得更好的效果,而不是仅仅调整摄像机前轴。
|
这里的球坐标与笛卡尔坐标的转换把x和z弄反了,如果你去看最后的源码,会发现作者在摄像机源码那里写了`yaw = yaw – 90`,实际上在这里x就应该是`sin(glm::radians(yaw))`,z也是同样处理,当然也可以认为是这个诡异的坐标系,但是在这里使用球坐标转笛卡尔坐标有个大问题,就是在初始渲染时,无法指定摄像机的初始朝向,还要花一些功夫自己实现这个;此外这只能实现像第一人称游戏一样的简易摄像机,类似Maya、Unity3D编辑器窗口的那种摄像机还是最好自己设置摄像机的位置、上、右、前轴,在旋转时用四元数对这四个变量进行调整,才能获得更好的效果,而不是仅仅调整摄像机前轴。
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
direction.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));//译注:direction代表摄像机的“前”轴,但此前轴是和本文第一幅图片的第二个摄像机的direction是相反的
|
direction.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));//译注:direction代表摄像机的“前”轴,但此前轴是和本文第一幅图片的第二个摄像机的direction是相反的
|
||||||
|
124
styleguide.md
124
styleguide.md
@@ -1,30 +1,11 @@
|
|||||||
# 校对指南(Styleguide)
|
# 样式指南
|
||||||
|
|
||||||
- **对照原文**
|
这里是LearnOpenGL中文化工程的样式指南,在编写新的翻译或者校对之前请先阅读此文档,以确定你的翻译符合要求。
|
||||||
- 使用中文的标点符号: 逗号、句号、双引号
|
|
||||||
- 使用英文的标点符号: 括号
|
|
||||||
- 文本中常量/代码用``加注为代码
|
|
||||||
- 代码块不使用Tab标注,改为用```式标注
|
|
||||||
- 每一节标题使用`#` (h1)标题(到后面会有几节有很多小节的,太小的标题不明显)
|
|
||||||
- 根据原文标题大小逐渐递增标题
|
|
||||||
- 注意"#"后标题前要空格
|
|
||||||
- 专有名词在对照表里找翻译,需要用括号标注原文
|
|
||||||
- 原文单词按照标题大写规则大写首字母
|
|
||||||
- 尽量大部分都翻译掉
|
|
||||||
- 在Markdown文件中如需插入图片或者代码,请与正文空一行
|
|
||||||
|
|
||||||
例:
|
## 基础
|
||||||
|
|
||||||
```markdown
|
- **对照原文,以原文为准**
|
||||||
[text]
|
- 必要时可以使用HTML代码
|
||||||
|
|
||||||
[img]
|
|
||||||
|
|
||||||
[text]
|
|
||||||
```
|
|
||||||
|
|
||||||
- 翻译注释
|
|
||||||
- 原文中的斜体一律用加粗表示(中文并不存在斜体),粗体也用粗体表示,注意不要自己添加粗体
|
|
||||||
- 每一节前面加上
|
- 每一节前面加上
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -35,6 +16,59 @@
|
|||||||
校对 | [校对]
|
校对 | [校对]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- 在Markdown文件中如需插入图片或者代码,请与正文空一行以方便阅读及解析,例如:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
[text]
|
||||||
|
|
||||||
|
[img]
|
||||||
|
|
||||||
|
[text]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 标点符号
|
||||||
|
|
||||||
|
- 一般情况下请使用中文的标点符号
|
||||||
|
- 当标注翻译的原文时,括号请使用英文的括号(英文与周围空太多会有点难看),但其它情况下请用中文的括号,如
|
||||||
|
|
||||||
|
```
|
||||||
|
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。
|
||||||
|
```
|
||||||
|
|
||||||
|
- 原文中的斜体一律用加粗表示(中文并不存在斜体),粗体也用粗体表示,注意不要自己违反原文添加粗体
|
||||||
|
|
||||||
|
## 代码
|
||||||
|
|
||||||
|
- 文本中常量/代码用``加注为代码
|
||||||
|
- 代码块不使用Tab标注,请用```式标注
|
||||||
|
- 代码的语言请用以下方式标注出来:
|
||||||
|
|
||||||
|
|
||||||
|
```c++
|
||||||
|
[code]
|
||||||
|
```
|
||||||
|
|
||||||
|
- 请记得翻译注释
|
||||||
|
|
||||||
|
|
||||||
|
## 标题
|
||||||
|
|
||||||
|
- 每一节标题使用`#`(h1)标题(到后面会有几节有很多小节的,太小的标题不明显)
|
||||||
|
- 根据原文标题大小逐渐递增标题
|
||||||
|
- 注意`#`后与标题前要加一个空格
|
||||||
|
|
||||||
|
## 专有名词
|
||||||
|
|
||||||
|
- 专有名词需要在第一次出现的之后用括号标注原文
|
||||||
|
- 原文单词按照标题大写规则大写首字母
|
||||||
|
- 翻译
|
||||||
|
- 首先,请与本工程中大部分的翻译保持一致
|
||||||
|
- 如果工程中找不到已有的翻译,请参考本文档最下面的词汇表寻找翻译
|
||||||
|
- 如果还是找不到,可以自己创造一个翻译,或者直接写英文
|
||||||
|
- “Additional resources”译作“附加资源”,“Exercises”译作“练习”,“Solution”译作“参考解答”
|
||||||
|
|
||||||
|
## 特殊元素
|
||||||
|
|
||||||
- 公式用[http://latex2png.com/](http://latex2png.com/)转换,文本中的公式Resolution为150,单独的公式为200
|
- 公式用[http://latex2png.com/](http://latex2png.com/)转换,文本中的公式Resolution为150,单独的公式为200
|
||||||
- 视频用Video标签添加
|
- 视频用Video标签添加
|
||||||
|
|
||||||
@@ -43,25 +77,43 @@
|
|||||||
</video>
|
</video>
|
||||||
```
|
```
|
||||||
|
|
||||||
- 如果有比较长的译注:
|
- 短的译注直接用中文括号插入文中标明译注即可,例如:
|
||||||
|
|
||||||
```
|
```
|
||||||
xxxx(([译注x])
|
文本(译注:[text])
|
||||||
|
|
||||||
[译注x]: http://learnopengl-cn.readthedocs.org "text"
|
|
||||||
```
|
```
|
||||||
效果会像这样([译注1])
|
|
||||||
|
|
||||||
- “Additional resources”译作“附加资源”,“Exercises”译作“练习”,“Solution”译作“参考解答”
|
- 如果有比较长的译注,请将以下标记插入文本的段落之后:
|
||||||
- 必要时可以使用HTML代码
|
|
||||||
|
|
||||||
**如果有不全的继续加**
|
```
|
||||||
|
!!! note "译注"
|
||||||
|
|
||||||
##专业词汇对照表
|
[text]
|
||||||
|
```
|
||||||
|
|
||||||
1. [《游戏引擎架构》中英词汇索引表](http://www.cnblogs.com/miloyip/p/GameEngineArchitectureIndex.html)
|
- 原文中的红色方框请用`!!! attention`标注,绿色方框请用`!!! important`标注,注意文本前有个Tab,格式如下:
|
||||||
|
|
||||||
2. 摘抄自《OpenGL超级宝典第五版》
|
红色方框:
|
||||||
|
|
||||||
|
```
|
||||||
|
!!! attention
|
||||||
|
|
||||||
|
[text]
|
||||||
|
```
|
||||||
|
|
||||||
|
绿色方框:
|
||||||
|
|
||||||
|
```
|
||||||
|
!!! important
|
||||||
|
|
||||||
|
[text]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 专业词汇对照表
|
||||||
|
|
||||||
|
1. [微软术语搜索](https://www.microsoft.com/Language/zh-cn/Search.aspx)
|
||||||
|
2. [《游戏引擎架构》中英词汇索引表](http://www.cnblogs.com/miloyip/p/GameEngineArchitectureIndex.html)
|
||||||
|
3. 摘抄自《OpenGL超级宝典第五版》:
|
||||||
|
|
||||||
英文词 | 对应翻译
|
英文词 | 对应翻译
|
||||||
---|---
|
---|---
|
||||||
@@ -122,4 +174,4 @@ Viewport|视口
|
|||||||
Wireframe|线框
|
Wireframe|线框
|
||||||
pipeline | 渲染管线
|
pipeline | 渲染管线
|
||||||
|
|
||||||
[译注1]: http://learnopengl-cn.readthedocs.org "bakabaka我是译注"
|
[译注1]: http://learnopengl-cn.readthedocs.org "这里是很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的译注"
|
Reference in New Issue
Block a user