1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 12:45:29 +08:00

Update sytle guide

This commit is contained in:
Meow J
2016-07-04 02:49:16 +08:00
parent ec944fb3f6
commit 17fe8a5dda
4 changed files with 102 additions and 46 deletions

View File

@@ -15,7 +15,7 @@ OpenGL规范严格规定了每个函数该如何执行以及它们的输出
实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候OpenGL库是由Apple自身维护的。在Linux下有显卡生产商提供的OpenGL库也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时基本都是库的开发者留下的bug。
!!! Important
!!! important
由于OpenGL的大多数实现都是由显卡厂商编写的当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL这也是为什么总是建议你偶尔更新一下显卡驱动。
@@ -31,7 +31,7 @@ OpenGL规范严格规定了每个函数该如何执行以及它们的输出
现今更高版本的OpenGL已经发布写作时最新版本为4.5你可能会问既然OpenGL 4.5 都出来了为什么我们还要学习OpenGL 3.3答案很简单所有OpenGL的更高的版本都是在3.3的基础上引入了额外的功能并没有改动核心架构。新版本只是引入了一些更有效率或更有用的方式去完成同样的功能。因此所有的概念和技术在现代OpenGL版本里都保持一致。当你的经验足够你可以轻松使用来自更高版本OpenGL的新特性。
!!! Attention
!!! attention
当使用新版本的OpenGL特性时只有新一代的显卡能够支持你的应用程序。这也是为什么大多数开发者基于较低版本的OpenGL编写程序并只提供选项启用新版本的特性。
@@ -78,7 +78,7 @@ struct object_name {
};
```
!!! Important
!!! important
**基元类型(Primitive Type)**
使用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`位置,这些选项就会重新生效。
!!! Attention
!!! attention
目前提供的示例代码只是OpenGL如何操作的一个大致描述通过阅读以后的教程你会遇到很多实际的例子。

View File

@@ -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
@@ -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

View File

@@ -279,9 +279,9 @@ direction.z = cos(glm::radians(pitch));
就像俯仰角一样我们可以看到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++
direction.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));//译注direction代表摄像机的“前”轴但此前轴是和本文第一幅图片的第二个摄像机的direction是相反的