From 9bed6f8c4f16e5fbf6bee9324f10fac61966f0c7 Mon Sep 17 00:00:00 2001 From: Meow J Date: Tue, 12 Jul 2016 01:02:35 +0800 Subject: [PATCH] 01-04 --- docs/01 Getting started/04 Hello Triangle.md | 298 +++++++++--------- docs/css/style.css | 2 - docs/img/01/04/hellotriangle.png | Bin 0 -> 14476 bytes docs/img/01/04/hellotriangle2.png | Bin 0 -> 13694 bytes docs/img/01/04/ndc.png | Bin 0 -> 27440 bytes docs/img/01/04/pipeline.png | Bin 0 -> 59604 bytes docs/img/01/04/vertex_array_objects.png | Bin 0 -> 28571 bytes docs/img/01/04/vertex_array_objects_ebo.png | Bin 0 -> 36198 bytes docs/img/01/04/vertex_attribute_pointer.png | Bin 0 -> 9997 bytes glossary.md | 16 +- .../01/04 => old/img}/OpenGL_pipline_cn.png | Bin 11 files changed, 156 insertions(+), 160 deletions(-) create mode 100644 docs/img/01/04/hellotriangle.png create mode 100644 docs/img/01/04/hellotriangle2.png create mode 100644 docs/img/01/04/ndc.png create mode 100644 docs/img/01/04/pipeline.png create mode 100644 docs/img/01/04/vertex_array_objects.png create mode 100644 docs/img/01/04/vertex_array_objects_ebo.png create mode 100644 docs/img/01/04/vertex_attribute_pointer.png rename {docs/img/01/04 => old/img}/OpenGL_pipline_cn.png (100%) diff --git a/docs/01 Getting started/04 Hello Triangle.md b/docs/01 Getting started/04 Hello Triangle.md index 32525c9..43e0a5d 100644 --- a/docs/01 Getting started/04 Hello Triangle.md +++ b/docs/01 Getting started/04 Hello Triangle.md @@ -7,23 +7,23 @@ 校对 | Geequlim -在OpenGL中,任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一个部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。这个教程里,我们会简单地讨论一下图形渲染管线,以及如何使用它创建一些像素,这对我们来说是有好处的。 +在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。这个教程里,我们会简单地讨论一下图形渲染管线,以及如何利用它创建一些漂亮的像素。 !!! Important - 2D坐标和像素也是不同的,2D坐标是在2D空间中的一个点的非常精确的表达,2D像素是这个点的近似值,它受到你的屏幕/窗口解析度的限制。 + 2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制。 -图形渲染管线接收一组3D坐标,然后把它们转变为你屏幕上的有色2D像素。图形渲染管线可以被划分为几个阶段,每个阶段需要把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的(它们有一个特定的函数),它们能简单地并行执行。由于它们的并行执行特性,当今大多数显卡都有成千上万的小处理核心,在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据。这些小程序叫做 **着色器**(Shader)。 +图形渲染管线接受一组3D坐标,然后把它们转变为你屏幕上的有色2D像素输出。图形渲染管线可以被划分为几个阶段,每个阶段将会把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的(它们都有一个特定的函数),并且很容易并行执行。正是由于它们具有并行执行的特性,当今大多数显卡都有成千上万的小处理核心,它们在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据。这些小程序叫做着色器(Shader)。 -有些着色器允许开发者自己配置,我们可以用自己写的着色器替换默认的。这样我们就可以更细致地控制图形渲染管线中的特定部分了,因为它们运行在GPU上,所以它们会节约宝贵的CPU时间。OpenGL着色器是用**OpenGL着色器语言**(OpenGL Shading Language, GLSL)写成的,我们在下一节会花更多时间研究它。 +有些着色器允许开发者自己配置,这就允许我们用自己写的着色器来替换默认的。这样我们就可以更细致地控制图形渲染管线中的特定部分了,而且因为它们运行在GPU上,所以它们可以给我们节约宝贵的CPU时间。OpenGL着色器是用OpenGL着色器语言(OpenGL Shading Language, GLSL)写成的,在下一节中我们再花更多时间研究它。 -在下面,你会看到一个图形渲染管线的每个阶段的抽象表达。要注意蓝色部分代表的是我们可以自定义的着色器。 +下面,你会看到一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分。 -![](../img/01/04/OpenGL_pipline_cn.png) +![](../img/01/04/pipeline.png) -如你所见,图形渲染管线包含很多部分,每个都是将你的顶点数据转变为最后渲染出来的像素这个大过程中的一个特定阶段。我们会概括性地解释渲染管线的每个部分,从而使你对图形渲染管线的工作方式有个大概了解。 +如你所见,图形渲染管线包含很多部分,每个部分都将在转换顶点数据到最终像素这一过程中处理各自特定的阶段。我们会概括性地解释一下渲染管线的每个部分,让你对图形渲染管线的工作方式有个大概了解。 -我们以数组的形式传递3个3D坐标作为图形渲染管线的输入,它用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);这里顶点数据是一些顶点的集合。一个**顶点**是一个3D坐标的集合(也就是x、y、z数据)。而顶点数据是用**顶点属性**(Vertex Attributes)表示的,它可以包含任何我们希望用的数据,但是简单起见,我们还是假定每个顶点只由一个3D位置(译注1)和几个颜色值组成的吧。 +首先,我们以数组的形式传递3个3D坐标作为图形渲染管线的输入,用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);顶点数据是一系列顶点的集合。一个顶点(Vertex)是一个3D坐标的数据的集合。而顶点数据是用顶点属性(Vertex Attribute)表示的,它可以包含任何我们想用的数据,但是简单起见,我们还是假定每个顶点只由一个3D位置(译注1)和一些颜色值组成的吧。 !!! note "译注1" @@ -31,36 +31,33 @@ !!! Important - 为了让OpenGL知道我们的坐标和颜色值构成的到底是什么,OpenGL需要你去提示你希望这些数据所表示的是什么类型。我们是希望把这些数据渲染成一系列的点?一系列的三角形?还是仅仅是一个长长的线?做出的这些提示叫做**基本图形**(Primitives),任何一个绘制命令的调用都必须把基本图形类型传递给OpenGL。这是其中的几个:**GL_POINTS**、**GL_TRIANGLES**、**GL_LINE_STRIP**。 + 为了让OpenGL知道我们的坐标和颜色值构成的到底是什么,OpenGL需要你去指定这些数据所表示的渲染类型。我们是希望把这些数据渲染成一系列的点?一系列的三角形?还是仅仅是一个长长的线?做出的这些提示叫做图元(Primitive),任何一个绘制指令的调用都将把图元传递给OpenGL。这是其中的几个:GL_POINTSGL_TRIANGLESGL_LINE_STRIP。 -图形渲染管线的第一个部分是**顶点着色器**(Vertex Shader),它把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转为另一种3D坐标(后面会解释),同时顶点着色器允许我们对顶点属性进行一些基本处理。 +图形渲染管线的第一个部分是顶点着色器(Vertex Shader),它把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转为另一种3D坐标(后面会解释),同时顶点着色器允许我们对顶点属性进行一些基本处理。 -**基本图形装配**(Primitive Assembly)阶段把顶点着色器的表示为基本图形的所有顶点作为输入(如果选择的是`GL_POINTS`,那么就是一个单独顶点),把所有点组装为特定的基本图形的形状;本节例子是一个三角形。 +图元装配(Primitive Assembly)阶段将顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并所有的点装配成指定图元的形状;本节例子中是一个三角形。 -基本图形装配阶段的输出会传递给**几何着色器**(Geometry Shader)。几何着色器把基本图形形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其他的)基本图形来生成其他形状。例子中,它生成了另一个三角形。 - -**细分着色器**(Tessellation Shaders)拥有把给定基本图形**细分**为更多小基本图形的能力。这样我们就能在物体更接近玩家的时候通过创建更多的三角形的方式创建出更加平滑的视觉效果。 - -细分着色器的输出会进入**光栅化**(Rasterization也译为像素化)阶段,这里它会把基本图形映射为屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前,会执行**裁切**(Clipping)。裁切会丢弃超出你的视图以外的那些像素,来提升执行效率。 +图元装配阶段的输出会传递给几何着色器(Geometry Shader)。几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。例子中,它生成了另一个三角形。 +几何着色器的输出会被传入光栅化阶段(Rasterization Stage),这里它会把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。 !!! Important - OpenGL中的一个fragment是OpenGL渲染一个独立像素所需的所有数据。 + OpenGL中的一个片段是OpenGL渲染一个像素所需的所有数据。 -**片段着色器**的主要目的是计算一个像素的最终颜色,这也是OpenGL高级效果产生的地方。通常,片段着色器包含用来计算像素最终颜色的3D场景的一些数据(比如光照、阴影、光的颜色等等)。 +片段着色器的主要目的是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。 -在所有相应颜色值确定以后,最终它会传到另一个阶段,我们叫做**alpha测试**和**混合**(Blending)阶段。这个阶段检测像素的相应的深度(和Stencil)值(后面会讲),使用这些,来检查这个像素是否在另一个物体的前面或后面,如此做到相应取舍。这个阶段也会检查**alpha值**(alpha值是一个物体的透明度值)和物体之间的**混合**(Blend)。所以,即使在片段着色器中计算出来了一个像素所输出的颜色,最后的像素颜色在渲染多个三角形的时候也可能完全不同。 +在所有对应颜色值确定以后,最终的对象将会被传到最后一个阶段,我们叫做Alpha测试混合(Blending)阶段。这个阶段检测片段的对应的深度(和模板(Stencil))值(后面会讲),用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。 -正如你所见的那样,图形渲染管线非常复杂,它包含很多要配置的部分。然而,对于大多数场合,我们必须做的只是顶点和片段着色器。几何着色器和细分着色器是可选的,通常使用默认的着色器就行了。 +可以看到,图形渲染管线非常复杂,它包含很多可配置的部分。然而,对于大多数场合,我们只需要配置顶点和片段着色器就行了。几何着色器是可选的,通常使用它默认的着色器就行了。 -在现代OpenGL中,我们**必须**定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。出于这个原因,开始学习现代OpenGL的时候非常困难,因为在你能够渲染自己的第一个三角形之前需要一大堆知识。本节结束就是你可以最终渲染出你的三角形的时候,你也会了解到很多图形编程知识。 +在现代OpenGL中,我们**必须**定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。出于这个原因,刚开始学习现代OpenGL的时候可能会非常困难,因为在你能够渲染自己的第一个三角形之前已经需要了解一大堆知识了。在本节结束你最终渲染出你的三角形的时候,你也会了解到非常多的图形编程知识。 ## 顶点输入 -开始绘制一些东西之前,我们必须给OpenGL输入一些顶点(Vertex)数据。OpenGL是一个3D图形库,所以我们在OpenGL中指定的所有坐标都是在3D坐标里(x、y和z)。OpenGL不是简单的把你所有的3D坐标变换为你屏幕上的2D像素;OpenGL只是在当它们的3个轴(x、y和z)在特定的-1.0到1.0的范围内时才处理3D坐标。所有在这个范围内的坐标叫做**标准化设备坐标**(Normalized Device Coordinates,NDC)会最终显示在你的屏幕上(所有出了这个范围的都不会显示)。 +开始绘制图形之前,我们必须先给OpenGL输入一些顶点数据。OpenGL是一个3D图形库,所以我们在OpenGL中指定的所有坐标都是3D坐标(x、y和z)。OpenGL不是简单地把**所有的**3D坐标变换为屏幕上的2D像素;OpenGL仅当3D坐标在3个轴(x、y和z)上都为-1.0到1.0的范围内时才处理它。所有在所谓的标准化设备坐标(Normalized Device Coordinates)范围内的坐标才会最终呈现在屏幕上(在这个范围以外的坐标都不会显示)。 -由于我们希望渲染一个三角形,我们指定所有的这三个顶点都有一个3D位置。我们把它们以`GLfloat`数组的方式定义为标准化设备坐标(也就是在OpenGL的可见区域)中。 +由于我们希望渲染一个三角形,我们一共要指定三个顶点,每个顶点都有一个3D位置。我们会将它们以标准化设备坐标的形式(OpenGL的可见区域)定义为一个`GLfloat`数组。 ```c++ GLfloat vertices[] = { @@ -70,7 +67,7 @@ GLfloat vertices[] = { }; ``` -由于OpenGL是在3D空间中工作的,我们渲染一个2D三角形,它的每个顶点都要有同一个z坐标0.0。在这样的方式中,三角形的每一处的深度(Depth, 译注2)都一样,从而使它看上去就像2D的。 +由于OpenGL是在3D空间中工作的,而我们渲染的是一个2D三角形,我们将它顶点的z坐标设置为0.0。这样子的话三角形每一点的**深度**(Depth,译注2)都是一样的,从而使它看上去像是2D的。 !!! note "译注2" @@ -82,52 +79,52 @@ GLfloat vertices[] = { 一旦你的顶点坐标已经在顶点着色器中处理过,它们就应该是**标准化设备坐标**了,标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上。下面你会看到我们定义的在标准化设备坐标中的三角形(忽略z轴): - ![](http://www.learnopengl.com/img/getting-started/ndc.png) + ![](../img/01/04/ndc.png) - 与通常的屏幕坐标不同,y轴正方向上的点和(0,0)坐标是这个图像的中心,而不是左上角。最后你希望所有(变换过的)坐标都在这个坐标空间中,否则它们就不可见了。 + 与通常的屏幕坐标不同,y轴正方向为向上,(0, 0)坐标是这个图像的中心,而不是左上角。最终你希望所有(变换过的)坐标都在这个坐标空间中,否则它们就不可见了。 - 你的标准化设备坐标接着会变换为**屏幕空间坐标**(Screen-space Coordinates),这是使用你通过`glViewport`函数提供的数据,进行**视口变换**(Viewport Transform)完成的。最后的屏幕空间坐标被变换为像素输入到片段着色器。 + 你的标准化设备坐标接着会变换为屏幕空间坐标(Screen-space Coordinates),这是使用你通过glViewport函数提供的数据,进行视口变换(Viewport Transform)完成的。所得的屏幕空间坐标又会被变换为片段输入到片段着色器中。 -有了这样的顶点数据,我们会把它作为输入数据发送给图形渲染管线的第一个处理阶段:顶点着色器。它会在GPU上创建储存空间用于储存我们的顶点数据,还要配置OpenGL如何解释这些内存,并且指定如何发送给显卡。顶点着色器接着会处理我们告诉它要处理内存中的顶点的数量。 +定义这样的顶点数据以后,我们会把它作为输入发送给图形渲染管线的第一个处理阶段:顶点着色器。它会在GPU上创建内存用于储存我们的顶点数据,还要配置OpenGL如何解释这些内存,并且指定其如何发送给显卡。顶点着色器接着会处理我们在内存中指定数量的顶点。 -我们通过**顶点缓冲对象**(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大批顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以无论何处我们都要尝试尽量一次性发送尽可能多的数据。当数据到了显卡内存中时,顶点着色器几乎立即就能获得顶点,这非常快。 +我们通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。当数据发送至显卡的内存中后,顶点着色器几乎能立即访问顶点,这是个非常快的过程。 -顶点缓冲对象(VBO)是我们在OpenGL教程中第一个出现的OpenGL对象。就像OpenGL中的其他对象一样,这个缓冲有一个独一无二的ID,所以我们可以使用`glGenBuffers`函数生成一个缓冲ID: +顶点缓冲对象是我们在[OpenGL](01 OpenGL.md)教程中第一个出现的OpenGL对象。就像OpenGL中的其它对象一样,这个缓冲有一个独一无二的ID,所以我们可以使用glGenBuffers函数和一个缓冲ID生成一个VBO对象: ```c++ GLuint VBO; glGenBuffers(1, &VBO); ``` -OpenGL有很多缓冲对象类型,`GL_ARRAY_BUFFER`是其中一个顶点缓冲对象的缓冲类型。OpenGL允许我们同时绑定多个缓冲,只要它们是不同的缓冲类型。我们可以使用`glBindBuffer`函数把新创建的缓冲绑定到`GL_ARRAY_BUFFER`上: +OpenGL有很多缓冲对象类型,顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER。OpenGL允许我们同时绑定多个缓冲,只要它们是不同的缓冲类型。我们可以使用glBindBuffer函数把新创建的缓冲绑定到GL_ARRAY_BUFFER目标上: ```c++ glBindBuffer(GL_ARRAY_BUFFER, VBO); ``` -从这一刻起,我们使用的任何缓冲函数(在`GL_ARRAY_BUFFER`目标上)都会用来配置当前绑定的缓冲(`VBO`)。然后我们可以调用`glBufferData`函数,它会把之前定义的顶点数据复制到缓冲的内存中: +从这一刻起,我们使用的任何(在GL_ARRAY_BUFFER目标上的)缓冲调用都会用来配置当前绑定的缓冲(VBO)。然后我们可以调用glBufferData函数,它会把之前定义的顶点数据复制到缓冲的内存中: ```c++ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); ``` -`glBufferData`是一个用来把用户定义的数据复制到当前绑定缓冲的函数。它的第一个参数是我们希望把数据复制到上面的缓冲类型:顶点缓冲对象当前绑定到`GL_ARRAY_BUFFER`目标上。第二个参数指定我们希望传递给缓冲的数据的大小(以字节为单位);用一个简单的`sizeof`计算出顶点数据就行。第三个参数是我们希望发送的真实数据。 +glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数。它的第一个参数是目标缓冲的类型:顶点缓冲对象当前绑定到GL_ARRAY_BUFFER目标上。第二个参数指定传输数据的大小(以字节为单位);用一个简单的`sizeof`计算出顶点数据大小就行。第三个参数是我们希望发送的实际数据。 -第四个参数指定了我们希望显卡如何管理给定的数据。有三种形式: +第四个参数指定了我们希望显卡如何管理给定的数据。它有三种形式: -- `GL_STATIC_DRAW` :数据不会或几乎不会改变。 -- `GL_DYNAMIC_DRAW`:数据会被改变很多。 -- `GL_STREAM_DRAW` :数据每次绘制时都会改变。 +- GL_STATIC_DRAW :数据不会或几乎不会改变。 +- GL_DYNAMIC_DRAW:数据会被改变很多。 +- GL_STREAM_DRAW :数据每次绘制时都会改变。 -三角形的位置数据不会改变,每次渲染调用时都保持原样,所以它使用的类型最好是`GL_STATIC_DRAW`。如果,比如,一个缓冲中的数据将频繁被改变,那么使用的类型就是`GL_DYNAMIC_DRAW`或`GL_STREAM_DRAW`。这样就能确保图形卡把数据放在高速写入的内存部分。 +三角形的位置数据不会改变,每次渲染调用时都保持原样,所以它的使用类型最好是GL_STATIC_DRAW。如果,比如说一个缓冲中的数据将频繁被改变,那么使用的类型就是GL_DYNAMIC_DRAWGL_STREAM_DRAW,这样就能确保显卡把数据放在能够高速写入的内存部分。 -现在我们把顶点数据储存在显卡的内存中,用VBO顶点缓冲对象管理。下面我们会创建一个顶点和片段着色器,来处理这些数据。现在我们开始着手创建它们吧。 +现在我们已经把顶点数据储存在显卡的内存中,用VBO这个顶点缓冲对象管理。下面我们会创建一个顶点和片段着色器来真正处理这些数据。现在我们开始着手创建它们吧。 ## 顶点着色器 -顶点着色器(Vertex Shader)是几个着色器中的一个,它是可编程的。现代OpenGL需要我们至少设置一个顶点和一个片段着色器,如果我们打算做渲染的话。我们会简要介绍一下着色器以及配置两个非常简单的着色器来绘制我们第一个三角形。下个教程里我们会更详细的讨论着色器。 +顶点着色器(Vertex Shader)是几个可编程着色器中的一个。如果我们打算做渲染的话,现代OpenGL需要我们至少设置一个顶点和一个片段着色器。我们会简要介绍一下着色器以及配置两个非常简单的着色器来绘制我们第一个三角形。下一节中我们会更详细的讨论着色器。 -我们需要做的第一件事是用着色器语言GLSL写顶点着色器,然后编译这个着色器,这样我们就可以在应用中使用它了。下面你会看到一个非常基础的顶点着色器的源代码,它就是使用GLSL写的: +我们需要做的第一件事是用着色器语言GLSL(OpenGL Shading Language)编写顶点着色器,然后编译这个着色器,这样我们就可以在程序中使用它了。下面你会看到一个非常基础的GLSL顶点着色器的源代码: ```c++ #version 330 core @@ -140,51 +137,51 @@ void main() } ``` -就像你所看到的那样,GLSL看起来很像C语言。每个着色器都起始于一个版本声明。这是因为OpenGL 3.3和更高的GLSL版本号要去匹配OpenGL的版本(GLSL420版本对应于OpenGL 4.2)。我们同样显式地表示我们会用核心模式(Core-profile)。 +可以看到,GLSL看起来很像C语言。每个着色器都起始于一个版本声明。OpenGL 3.3以及和更高版本中,GLSL版本号和OpenGL的版本是匹配的(比如说GLSL 420版本对应于OpenGL 4.2)。我们同样明确表示我们会使用核心模式。 -下一步,我们在顶点着色器中声明所有的输入顶点属性,使用in关键字。现在我们只关心位置(Position)数据,所以我们只需要一个顶点属性(Attribute)。GLSL有一个向量数据类型,它包含1到4个`float`元素,包含的数量可以从它的后缀看出来。由于每个顶点都有一个3D坐标,我们就创建一个`vec3`输入变量来表示位置(Position)。我们同样也指定输入变量的位置值(Location),这是用`layout (location = 0)`来完成的,你后面会看到为什么我们会需要这个位置值。 +下一步,使用`in`关键字,在顶点着色器中声明所有的输入顶点属性(Input Vertex Attribute)。现在我们只关心位置(Position)数据,所以我们只需要一个顶点属性。GLSL有一个向量数据类型,它包含1到4个`float`分量,包含的数量可以从它的后缀数字看出来。由于每个顶点都有一个3D坐标,我们就创建一个`vec3`输入变量position。我们同样也通过`layout (location = 0)`设定了输入变量的位置值(Location)你后面会看到为什么我们会需要这个位置值。 !!! Important **向量(Vector)** - 在图形编程中我们经常会使用向量这个数学概念,因为它简明地表达了任意空间中位置和方向,二者是有用的数学属性。在GLSL中一个向量有最多4个元素,每个元素值都可以从各自代表一个空间坐标的`vec.x`、`vec.y`、`vec.z`和`vec.w`来获取到。注意`vec.w`元素不是用作表达空间中的位置的(我们处理的是3D不是4D)而是用在所谓透视划分(Perspective Division)上。我们会在后面的教程中更详细地讨论向量。 + 在图形编程中我们经常会使用向量这个数学概念,因为它简明地表达了任意空间中的位置和方向,并且它有非常有用的数学属性。在GLSL中一个向量有最多4个分量,每个分量值都代表空间中的一个坐标,它们可以通过`vec.x`、`vec.y`、`vec.z`和`vec.w`来获取。注意`vec.w`分量不是用作表达空间中的位置的(我们处理的是3D不是4D),而是用在所谓透视划分(Perspective Division)上。我们会在后面的教程中更详细地讨论向量。 -为了设置顶点着色器的输出,我们必须把位置数据赋值给预定义的`gl_Position`变量,这个位置数据是一个`vec4`类型的。在main函数的最后,无论我们给`gl_Position`设置成什么,它都会成为着色器的输出。由于我们的输入是一个3元素的向量,我们必须把它转换为4元素。我们可以通过把`vec3`数据作为`vec4`初始化构造器的参数,同时把`w`元素设置为`1.0f`(我们会在后面解释为什么)。 +为了设置顶点着色器的输出,我们必须把位置数据赋值给预定义的gl_Position变量,它在幕后是`vec4`类型的。在main函数的最后,我们将gl_Position设置的值会成为该顶点着色器的输出。由于我们的输入是一个3分量的向量,我们必须把它转换为4分量的。我们可以把`vec3`的数据作为`vec4`构造器的参数,同时把`w`分量设置为`1.0f`(我们会在后面解释为什么)来完成这一任务。 -这个顶点着色器可能是能想到的最简单的了,因为我们什么都没有处理就把输入数据输出了。在真实的应用里输入数据通常都没有在标准化设备坐标中,所以我们首先就必须把它们放进OpenGL的可视区域内。 +当前这个顶点着色器可能是我们能想到的最简单的顶点着色器了,因为我们对输入数据什么都没有处理就把它传到着色器的输出了。在真实的程序里输入数据通常都不是标准化设备坐标,所以我们首先必须先把它们转换至OpenGL的可视区域内。 ## 编译着色器 -我们已经写了一个顶点着色器源码,但是为了OpenGL能够使用它,我们必须在运行时动态编译它的源码。 +我们已经写了一个顶点着色器源码(储存在一个C的字符串中),但是为了能够让OpenGL使用它,我们必须在运行时动态编译它的源码。 -我们要做的第一件事是创建一个着色器对象,再次引用它的ID。所以我们储存这个顶点着色器为`GLuint`,然后用`glCreateShader`创建着色器: +我们首先要做的是创建一个着色器对象,注意还是用ID来引用的。所以我们储存这个顶点着色器为`GLuint`,然后用glCreateShader创建这个着色器: ```c++ GLuint vertexShader; vertexShader = glCreateShader(GL_VERTEX_SHADER); ``` -我们把着色器的类型提供`glCreateShader`作为它的参数。这里我们传递的参数是`GL_VERTEX_SHADER`这样就创建了一个顶点着色器。 +我们把需要创建的着色器类型以参数形式提供给glCreateShader。由于我们正在创建一个顶点着色器,传递的参数是GL_VERTEX_SHADER。 -下一步我们把这个着色器源码附加到着色器对象,然后编译它: +下一步我们把这个着色器源码附加到着色器对象上,然后编译它: ```c++ glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); ``` -`glShaderSource`函数把着色器对象作为第一个参数来编译它。第二参数指定了源码中有多少个**字符串**,这里只有一个。第三个参数是顶点着色器真正的源码,我们可以把第四个参数先设置为`NULL`。 +glShaderSource函数把要编译的着色器对象作为第一个参数。第二参数指定了传递的源码字符串数量,这里只有一个。第三个参数是顶点着色器真正的源码,第四个参数我们先设置为`NULL`。 !!! Important - 你可能会希望检测调用`glCompileShader`后是否编译成功了,是否要去修正错误。检测编译时错误的方法是: + 你可能会希望检测在调用glCompileShader后编译是否成功了,如果没成功的话,你还会希望知道错误是什么,这样你才能修复它们。检测编译时错误可以通过以下代码来实现: GLint success; GLchar infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); - 首先我们定义一个整型来表示是否成功编译,还需要一个储存错误消息的容器(如果有的话)。然后我们用`glGetShaderiv`检查是否编译成功了。如果编译失败,我们应该用`glGetShaderInfoLog`获取错误消息,然后打印它。 + 首先我们定义一个整型变量来表示是否成功编译,还定义了一个储存错误消息(如果有的话)的容器。然后我们用glGetShaderiv检查是否编译成功。如果编译失败,我们会用glGetShaderInfoLog获取错误消息,然后打印它。 if(!success) { @@ -192,15 +189,15 @@ glCompileShader(vertexShader); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; } -如果编译的时候没有任何错误,顶点着色器就被编译成功了。 +如果编译的时候没有检测到任何错误,顶点着色器就被编译成功了。 ## 片段着色器 -片段着色器(Fragment Shader)是第二个也是最终我们打算创建的用于渲染三角形的着色器。片段着色器的全部,都是用来计算你的像素的最后颜色输出。为了让事情比较简单,我们的片段着色器只输出橘黄色。 +片段着色器(Fragment Shader)是第二个也是最后一个我们打算创建的用于渲染三角形的着色器。片段着色器全是关于计算你的像素最后的颜色输出。为了让事情更简单,我们的片段着色器将会一直输出橘黄色。 !!! Important - 在计算机图形中颜色被表示为有4个元素的数组:红色、绿色、蓝色和alpha(透明度)元素,通常缩写为RGBA。当定义一个OpenGL或GLSL的颜色的时候,我们就把每个颜色的强度设置在0.0到1.0之间。比如,我们设置红色为1.0f,绿色为1.0f,这样这个混合色就是黄色了。这三种颜色元素的不同调配可以生成1600万不同颜色! + 在计算机图形中颜色被表示为有4个元素的数组:红色、绿色、蓝色和alpha(透明度)分量,通常缩写为RGBA。当在OpenGL或GLSL中定义一个颜色的时候,我们把颜色每个分量的强度设置在0.0到1.0之间。比如说我们设置红为1.0f,绿为1.0f,我们会得到两个颜色的混合色,即黄色。这三种颜色分量的不同调配可以生成超过1600万种不同的颜色! ```c++ #version 330 core @@ -213,9 +210,9 @@ void main() } ``` -片段着色器只需要一个输出变量,这个变量是一个4元素表示的最终输出颜色的向量,我们可以自己计算出来。我们可以用`out`关键字声明输出变量,这里我们命名为`color`。下面,我们简单的把一个带有alpha值为1.0(1.0代表完全不透明)的橘黄的`vec4`赋值给`color`作为输出。 +片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,我们应该自己将其计算出来。我们可以用`out`关键字声明输出变量,这里我们命名为color。下面,我们将一个alpha值为1.0(1.0代表完全不透明)的橘黄色的`vec4`赋值给颜色输出。 -编译片段着色器的过程与顶点着色器相似,尽管这次我们使用`GL_FRAGMENT_SHADER`作为着色器类型: +编译片段着色器的过程与顶点着色器类似,只不过我们使用GL_FRAGMENT_SHADER常量作为着色器类型: ```c++ GLuint fragmentShader; @@ -224,13 +221,13 @@ glShaderSource(fragmentShader, 1, &fragmentShaderSource, null); glCompileShader(fragmentShader); ``` -每个着色器现在都编译了,剩下的事情是把两个着色器对象链接到一个着色器程序中(Shader Program),它是用来渲染的。 +两个着色器现在都编译了,剩下的事情是把两个着色器对象链接到一个用来渲染的着色器程序(Shader Program)中。 ### 着色器程序 -着色器程序对象(Shader Program Object)是多个着色器最后链接的版本。如果要使用刚才编译的着色器我们必须把它们链接为一个着色器程序对象,然后当渲染物体的时候激活这个着色器程序。激活了的着色器程序的着色器,在调用渲染函数时才可用。 +着色器程序对象(Shader Program Object)是多个着色器合并之后并最终链接完成的版本。如果要使用刚才编译的着色器我们必须把它们链接为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。 -把着色器链接为一个程序就等于把每个着色器的输出链接到下一个着色器的输入。如果你的输出和输入不匹配那么就会得到一个链接错误。 +当链接着色器至一个程序的时候,它会把每个着色器的输出链接到下个着色器的输入。当输出和输入不匹配的时候,你会得到一个连接错误。 创建一个程序对象很简单: @@ -239,7 +236,7 @@ GLuint shaderProgram; shaderProgram = glCreateProgram(); ``` -`glCreateProgram`函数创建一个程序,返回新创建的程序对象的ID引用。现在我们需要把前面编译的着色器附加到程序对象上,然后用`glLinkProgram`链接它们: +glCreateProgram函数创建一个程序,并返回新创建程序对象的ID引用。现在我们需要把之前编译的着色器附加到程序对象上,然后用glLinkProgram链接它们: ```c++ glAttachShader(shaderProgram, vertexShader); @@ -247,11 +244,11 @@ glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); ``` -代码不言自明,我们把着色器附加到程序上,然后用`glLinkProgram`链接。 +代码应该很清楚,我们把着色器附加到了程序上,然后用glLinkProgram链接。 !!! Important - 就像着色器的编译一样,我们也可以检验链接着色器程序是否失败,获得相应的日志。与glGetShaderiv和glGetShaderInfoLog不同,现在我们使用: + 就像着色器的编译一样,我们也可以检测链接着色器程序是否失败,并获取相应的日志。与上面不同,我们不会调用glGetShaderivglGetShaderInfoLog,现在我们使用: glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if(!success) { @@ -259,119 +256,114 @@ glLinkProgram(shaderProgram); ... } -我们可以调用`glUseProgram`函数,用新创建的程序对象作为它的参数,这样就能激活这个程序对象: +得到的结果就是一个程序对象,我们可以调用glUseProgram函数,用刚创建的程序对象作为它的参数,以激活这个程序对象: ```c++ glUseProgram(shaderProgram); ``` -现在在`glUseProgram`函数调用之后的每个着色器和渲染函数都会用到这个程序对象(当然还有这些链接的着色器)了。 +在glUseProgram函数调用之后,每个着色器调用和渲染调用都会使用这个程序对象(也就是之前写的着色器)了。 -在我们把着色器对象链接到程序对象以后,不要忘记删除着色器对象;我们不再需要它们了: +对了,在把着色器对象链接到程序对象以后,记得删除着色器对象,我们不再需要它们了: ```c++ glDeleteShader(vertexShader); glDeleteShader(fragmentShader); ``` -现在,我们把输入顶点数据发送给GPU,指示GPU如何在顶点和片段着色器中处理它。还没结束,OpenGL还不知道如何解释内存中的顶点数据,以及怎样把顶点数据链接到顶点着色器的属性上。我们需要告诉OpenGL怎么做。 +现在,我们已经把输入顶点数据发送给了GPU,并指示了GPU如何在顶点和片段着色器中处理它。就快要完成了,但还没结束,OpenGL还不知道它该如何解释内存中的顶点数据,以及它该如何将顶点数据链接到顶点着色器的属性上。我们需要告诉OpenGL怎么做。 ## 链接顶点属性 -顶点着色器允许我们以任何我们想要的形式作为顶点属性(Vertex Attribute)的输入,同样它也具有很强的灵活性,这意味着我们必须手动指定我们的输入数据的哪一个部分对应顶点着色器的哪一个顶点属性。这意味着我们必须在渲染前指定OpenGL如何解释顶点数据。 +顶点着色器允许我们指定任何以顶点属性为形式的输入。这使其具有很强的灵活性的同时,它还的确意味着我们必须手动指定输入数据的哪一个部分对应顶点着色器的哪一个顶点属性。所以,我们必须在渲染前指定OpenGL该如何解释顶点数据。 -我们的顶点缓冲数据被格式化为下面的形式: +我们的顶点缓冲数据会被解析为下面这样子: -![](http://learnopengl.com/img/getting-started/vertex_attribute_pointer.png) +![](../img/01/04/vertex_attribute_pointer.png) -- 位置数据被储存为32-bit(4 byte)浮点值。 +- 位置数据被储存为32-bit(4字节)浮点值。 - 每个位置包含3个这样的值。 -- 在这3个值之间没有空隙(或其他值)。这几个值紧密排列为一个数组。 -- 数据中第一个值是缓冲的开始位置。 +- 在这3个值之间没有空隙(或其他值)。这几个值在数组中紧密排列。 +- 数据中第一个值在缓冲开始的位置。 -有了这些信息我们就可以告诉OpenGL如何解释顶点数据了(每一个顶点属性),我们使用`glVertexAttribPointer`这个函数: +有了这些信息我们就可以使用glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据(应用到逐个顶点属性上)了: ```c++ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); ``` -`glVertexAttribPointer`函数有很多参数,所以我们仔细来了解它们: +glVertexAttribPointer函数的参数非常多,所以我会逐一介绍它们: -- 第一个参数指定我们要配置哪一个顶点属性。记住,我们在顶点着色器中使用`layout(location = 0)`定义了顶点属性——位置(Position)的位置值(Location)。这样要把顶点属性的位置值(Location)设置为0,因为我们希望把数据传递到这个顶点属性中,所以我们在这里填0。 -- 第二个参数指定顶点属性的大小。顶点属性是`vec3`类型,它由3个数值组成。 -- 第三个参数指定数据的类型,这里是`GL_FLOAT`(GLSL中`vec*`是由浮点数组成的)。 -- 下个参数定义我们是否希望数据被标准化。如果我们设置为`GL_TRUE`,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为`GL_FALSE`。 -- 第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性之间间隔有多少。由于下个位置数据在3个`GLfloat`后面的位置,我们把步长设置为`3 * sizeof(GLfloat)`。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。每当我们有更多的顶点属性,我们就必须小心地定义每个顶点属性之间的空间,我们在后面会看到更多的例子(译注: 这个参数的意思简单说就是从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。 -- 最后一个参数有奇怪的`GLvoid*`的强制类型转换。它表示我们的位置数据在缓冲中起始位置的偏移量。由于位置数据是数组的开始,所以这里是0。我们会在后面详细解释这个参数。 +- 第一个参数指定我们要配置的顶点属性。还记得我们在顶点着色器中使用`layout(location = 0)`定义了position顶点属性的位置值(Location)吗?它可以把顶点属性的位置值设置为`0`。因为我们希望把数据传递到这一个顶点属性中,所以这里我们传入`0`。 +- 第二个参数指定顶点属性的大小。顶点属性是一个`vec3`,它由3个值组成,所以大小是3。 +- 第三个参数指定数据的类型,这里是GL_FLOAT(GLSL中`vec*`都是由浮点数值组成的)。 +- 下个参数定义我们是否希望数据被标准化(Normalize)。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE。 +- 第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性组之间的间隔。由于下个组位置数据在3个`GLfloat`之后,我们把步长设置为`3 * sizeof(GLfloat)`。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。一旦我们有更多的顶点属性,我们就必须更小心地定义每个顶点属性之间的间隔,我们在后面会看到更多的例子(译注: 这个参数的意思简单说就是从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。 +- 最后一个参数的类型是`GLvoid*`,所以需要我们进行这个奇怪的强制类型转换。它表示位置数据在缓冲中起始位置的偏移量(Offset)。由于位置数据在数组的开头,所以这里是0。我们会在后面详细解释这个参数。 !!! Important - 每个顶点属性从VBO管理的内存中获得它的数据,它所获取数据的那个VBO,就是当调用`glVetexAttribPointer`的时候,最近绑定到`GL_ARRAY_BUFFER`的那个VBO。由于在调用`glVertexAttribPointer`之前绑定了VBO,顶点属性0现在链接到了它的顶点数据。 + 每个顶点属性从一个VBO管理的内存中获得它的数据,而具体是从哪个VBO(程序中可以有多个VBO)获取则是通过在调用glVetexAttribPointer时绑定到GL_ARRAY_BUFFER的VBO决定的。由于在调用glVetexAttribPointer之前绑定的是先前定义的VBO对象,顶点属性`0`现在会链接到它的顶点数据。 -现在我们定义OpenGL如何解释顶点数据,我们也要开启顶点属性,使用`glEnableVertexAttribArray`,把顶点属性位置值作为它的参数;顶点属性默认是关闭的。自此,我们把每件事都做好了:我们使用一个顶点缓冲对象初始化了一个缓冲中的顶点数据,设置了一个顶点和片段着色器,告诉了OpenGL如何把顶点数据链接到顶点着色器的顶点属性上。在OpenGL绘制一个物体,看起来会像是这样: +现在我们已经定义了OpenGL该如何解释顶点数据,我们现在应该使用glEnableVertexAttribArray,以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的。自此,所有东西都已经设置好了:我们使用一个顶点缓冲对象将顶点数据初始化至缓冲中,建立了一个顶点和一个片段着色器,并告诉了OpenGL如何把顶点数据链接到顶点着色器的顶点属性上。在OpenGL中绘制一个物体,代码会像是这样: ```c++ -// 0. 复制顶点数组到缓冲中提供给OpenGL使用 +// 0. 复制顶点数组到缓冲中供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 1. 设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); -glEnableVertexAttribArray(0); -// 2. 当我们打算渲染一个物体时要使用着色器程序 +glEnableVertexAttribArray(0); +// 2. 当我们渲染一个物体时要使用着色器程序 glUseProgram(shaderProgram); // 3. 绘制物体 someOpenGLFunctionThatDrawsOurTriangle(); ``` -我们绘制一个物体的时候必须重复这件事。这看起来也不多,但是如果有超过5个顶点属性,100多个不同物体呢(这其实并不罕见)。绑定合适的缓冲对象,为每个物体配置所有顶点属性很快就变成一件麻烦事。有没有一些方法可以使我们把所有的配置储存在一个对象中,并且可以通过绑定这个对象来恢复状态? +每当我们绘制一个物体的时候都必须重复这一过程。这看起来可能不多,但是如果有超过5个顶点属性,上百个不同物体呢(这其实并不罕见)。绑定正确的缓冲对象,为每个物体配置所有顶点属性很快就变成一件麻烦事。有没有一些方法可以使我们把所有这些状态配置储存在一个对象中,并且可以通过绑定这个对象来恢复状态呢? ### 顶点数组对象 -**顶点数组对象(Vertex Array Object, VAO)**可以像顶点缓冲对象一样绑定,任何随后的顶点属性调用都会储存在这个VAO中。这有一个好处,当配置顶点属性指针时,你只用做一次,每次绘制一个物体的时候,我们绑定相应VAO就行了。切换不同顶点数据和属性配置就像绑定一个不同的VAO一样简单。所有状态我们都放到了VAO里。 +顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在这个VAO中。这样的好处就是,当配置顶点属性指针时,你只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。这使在不同顶点数据和属性配置之间切换变得非常简单,只需要绑定不同的VAO就行了。刚刚设置的所有状态都将存储在VAO中 !!! Attention - OpenGL核心模式版要求我们使用VAO,这样它就能知道对我们的顶点输入做些什么。如果我们绑定VAO失败,OpenGL会拒绝绘制任何东西。 + OpenGL的核心模式**要求**我们使用VAO,所以它知道该如何处理我们的顶点输入。如果我们绑定VAO失败,OpenGL会拒绝绘制任何东西。 -一个顶点数组对象储存下面的内容: +一个顶点数组对象会储存以下这些内容: -- 调用`glEnableVertexAttribArray`和`glDisableVertexAttribArray`。 -- 使用`glVertexAttribPointer`的顶点属性配置。 -- 使用`glVertexAttribPointer`进行的顶点缓冲对象与顶点属性链接。 +- glEnableVertexAttribArrayglDisableVertexAttribArray的调用。 +- 通过glVertexAttribPointer设置的顶点属性配置。 +- 通过`glVertexAttribPointer`调用进行的顶点缓冲对象与顶点属性链接。 -![](http://learnopengl.com/img/getting-started/vertex_array_objects.png) +![](../img/01/04/vertex_array_objects.png) -生成一个VAO和生成VBO类似: +创建一个VAO和创建一个VBO很类似: ```c++ GLuint VAO; glGenVertexArrays(1, &VAO); ``` -使用VAO要做的全部就是使用`glBindVertexArray`绑定VAO。自此我们就应该绑定/配置相应的VBO和属性指针,然后解绑VAO以备后用。当我们打算绘制一个物体的时候,我们只要在绘制物体前简单地把VAO绑定到希望用到的配置就行了。这段代码应该看起来像这样: +要想使用VAO,要做的只是使用glBindVertexArray绑定VAO。从绑定之后起,我们应该绑定和配置对应的VBO和属性指针,之后解绑VAO供之后使用。当我们打算绘制一个物体的时候,我们只要在绘制物体前简单地把VAO绑定到希望使用的设定上就行了。这段代码应该看起来像这样: ```c++ -// ..:: 初始化代码 (一次完成 (除非你的物体频繁改变)) :: .. - +// ..:: 初始化代码(只运行一次 (除非你的物体频繁改变)) :: .. // 1. 绑定VAO glBindVertexArray(VAO); - -// 2. 把顶点数组复制到缓冲中提供给OpenGL使用 -glBindBuffer(GL_ARRAY_BUFFER, VBO); -glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - -// 3. 设置顶点属性指针 -glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid * )0); -glEnableVertexAttribArray(0); - + // 2. 把顶点数组复制到缓冲中供OpenGL使用 + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + // 3. 设置顶点属性指针 + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); + glEnableVertexAttribArray(0); //4. 解绑VAO glBindVertexArray(0); [...] -// ..:: 绘制代码 (in Game loop) :: .. - +// ..:: 绘制代(游戏循环中) :: .. // 5. 绘制物体 glUseProgram(shaderProgram); glBindVertexArray(VAO); @@ -381,13 +373,13 @@ glBindVertexArray(0); !!! Attention - 通常情况下当我们配置好它们以后要解绑OpenGL对象,这样我们才不会在某处错误地配置它们。 + 通常情况下当我们配置好OpenGL对象以后要解绑它们,这样我们才不会在其它地方错误地配置它们。 -就是现在!前面做的一切都是等待这一刻,我们已经把我们的顶点属性配置和打算使用的VBO储存到一个VAO中。一般当你有多个物体打算绘制时,你首先要生成/配置所有的VAO(它需要VBO和属性指针),然后储存它们准备后面使用。当我们打算绘制物体的时候就拿出相应的VAO,绑定它,绘制完物体后,再解绑VAO。 +就这么多了!前面做的一切都是等待这一刻,一个储存了我们顶点属性配置和应使用的VBO的顶点数组对象。一般当你打算绘制多个物体时,你首先要生成/配置所有的VAO(和必须的VBO及属性指针),然后储存它们供后面使用。当我们打算绘制物体的时候就拿出相应的VAO,绑定它,绘制完物体后,再解绑VAO。 ### 我们一直期待的三角形 -OpenGL的`glDrawArrays`函数为我们提供了绘制物体的能力,它使用当前激活的着色器、前面定义的顶点属性配置和VBO的顶点数据(通过VAO间接绑定)来绘制基本图形。 +要想绘制我们想要的物体,OpenGL给我们提供了glDrawArrays函数,它使用当前激活的着色器,之前定义的顶点属性配置,和VBO的顶点数据(通过VAO间接绑定)来绘制图元。 ```c++ glUseProgram(shaderProgram); @@ -396,28 +388,26 @@ glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0); ``` -`glDrawArrays`函数第一个参数是我们打算绘制的OpenGL基本图形的类型。由于我们在一开始时说过,我们希望绘制三角形,我们传递`GL_TRIANGLES`给它。第二个参数定义了我们打算绘制的那个顶点数组的起始位置的索引;我们这里填0。最后一个参数指定我们打算绘制多少个顶点,这里是3(我们只从我们的数据渲染一个三角形,它只有3个顶点)。 +glDrawArrays函数第一个参数是我们打算绘制的OpenGL图元的类型。由于我们在一开始时说过,我们希望绘制的是一个三角形,这里传递GL_TRIANGLES给它。第二个参数指定了顶点数组的起始索引,我们这里填`0`。最后一个参数指定我们打算绘制多少个顶点,这里是3(我们只从我们的数据中渲染一个三角形,它只有3个顶点长)。 现在尝试编译代码,如果弹出了任何错误,回头检查你的代码。如果你编译通过了,你应该看到下面的结果: -![](http://learnopengl.com/img/getting-started/hellotriangle.png) +![](../img/01/04/hellotriangle.png) 完整的程序源码可以在[这里](http://learnopengl.com/code_viewer.php?code=getting-started/hellotriangle)找到。 -如果你的输出和这个不一样,你可能做错了什么,去看源码,看看是否遗漏了什么东西或者在评论部分提问。 +如果你的输出和这个看起来不一样,你可能做错了什么。去查看一下源码,检查你是否遗漏了什么东西,或者你也可以在评论区提问。 ## 索引缓冲对象 -这是我们最后一件在渲染顶点这个问题上要讨论的事——索引缓冲对象(Element Buffer Objects,EBO)。解释索引缓冲对象的工作方式最好是举例子:假设我们不再绘制一个三角形而是矩形。我们就可以绘制两个三角形来组成一个矩形(OpenGL主要就是绘制三角形)。这会生成下面的顶点的集合: +在渲染顶点这一话题上我们还有最有一个需要讨论的东西——索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)。要解释索引缓冲对象的工作方式最好还是举个例子:假设我们不再绘制一个三角形而是绘制一个矩形。我们可以绘制两个三角形来组成一个矩形(OpenGL主要处理三角形)。这会生成下面的顶点的集合: ```c++ GLfloat vertices[] = { - // 第一个三角形 0.5f, 0.5f, 0.0f, // 右上角 0.5f, -0.5f, 0.0f, // 右下角 -0.5f, 0.5f, 0.0f, // 左上角 - // 第二个三角形 0.5f, -0.5f, 0.0f, // 右下角 -0.5f, -0.5f, 0.0f, // 左下角 @@ -425,21 +415,19 @@ GLfloat vertices[] = { }; ``` -就像你所看到的那样,有几个顶点叠加了。我们指定右下角和左上角两次!一个矩形只有4个而不是6个顶点,这样就产生50%的额外开销。当我们有超过1000个三角的模型这个问题会更糟糕,这会产生一大堆浪费。最好的解决方案就是每个顶点只储存一次,当我们打算绘制这些顶点的时候只调用顶点的索引。这种情况我们只要储存4个顶点就能绘制矩形了,我们只要指定我们打算绘制的那个顶点的索引就行了。如果OpenGL提供这个功能就好了,对吧? +可以看到,有几个顶点叠加了。我们指定了`右下角`和`左上角`两次!一个矩形只有4个而不是6个顶点,这样就产生50%的额外开销。当我们有包括上千个三角形的模型之后这个问题会更糟糕,这会产生一大堆浪费。更好的解决方案是只储存不同的顶点,并设定绘制这些顶点的顺序。这样子我们只要储存4个顶点就能绘制矩形了,之后只要指定绘制的顺序就行了。如果OpenGL提供这个功能就好了,对吧? -很幸运,索引缓冲的工作方式正是这样的。一个EBO是一个像顶点缓冲对象(VBO)一样的缓冲,它专门储存索引,OpenGL调用这些顶点的索引来绘制。索引绘制正是这个问题的解决方案。我们先要定义(独一无二的)顶点,和绘制出矩形的索引: +很幸运,索引缓冲对象的工作方式正是这样的。和顶点缓冲对象一样,EBO也是一个缓冲,它专门储存索引,OpenGL调用这些顶点的索引来决定该绘制哪个顶点。所谓的索引绘制(Indexed Drawing)正是我们问题的解决方案。首先,我们先要定义(独一无二的)顶点,和绘制出矩形所需的索引: ```c++ GLfloat vertices[] = { - 0.5f, 0.5f, 0.0f, // 右上角 0.5f, -0.5f, 0.0f, // 右下角 -0.5f, -0.5f, 0.0f, // 左下角 -0.5f, 0.5f, 0.0f // 左上角 }; -GLuint indices[] = { // 起始于0! - +GLuint indices[] = { // 注意索引从0开始! 0, 1, 3, // 第一个三角形 1, 2, 3 // 第二个三角形 }; @@ -452,55 +440,51 @@ GLuint EBO; glGenBuffers(1, &EBO); ``` -与VBO相似,我们绑定EBO然后用`glBufferData`把索引复制到缓冲里。同样,和VBO相似,我们会把这些函数调用放在绑定和解绑函数调用之间,这次我们把缓冲的类型定义为`GL_ELEMENT_ARRAY_BUFFER`。 +与VBO类似,我们先绑定EBO然后用glBufferData把索引复制到缓冲里。同样,和VBO类似,我们会把这些函数调用放在绑定和解绑函数调用之间,只不过这次我们把缓冲的类型定义为GL_ELEMENT_ARRAY_BUFFER。 ```c++ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); ``` -要注意的是,我们现在用`GL_ELEMENT_ARRAY_BUFFER`当作缓冲目标。最后一件要做的事是用`glDrawElements`来替换`glDrawArrays`函数,来指明我们从索引缓冲渲染。当时用`glDrawElements`的时候,我们就会用当前绑定的索引缓冲进行绘制: +要注意的是,我们传递了GL_ELEMENT_ARRAY_BUFFER当作缓冲目标。最后一件要做的事是用glDrawElements来替换glDrawArrays函数,来指明我们从索引缓冲渲染。使用glDrawElements时,我们会使用当前绑定的索引缓冲对象中的索引进行绘制: ```c++ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); ``` -第一个参数指定了我们绘制的模式,这个和`glDrawArrays`的一样。第二个参数是我们打算绘制顶点的次数。我们填6,说明我们总共想绘制6个顶点。第三个参数是索引的类型,这里是`GL_UNSIGNED_INT`。最后一个参数里我们可以指定EBO中的偏移量(或者传递一个索引数组,但是这只是当你不是在使用索引缓冲对象的时候),但是我们只打算在这里填写0。 +第一个参数指定了我们绘制的模式,这个和glDrawArrays的一样。第二个参数是我们打算绘制顶点的个数,这里填6,也就是说我们一共需要绘制6个顶点。第三个参数是索引的类型,这里是GL_UNSIGNED_INT。最后一个参数里我们可以指定EBO中的偏移量(或者传递一个索引数组,但是这是当你不在使用索引缓冲对象的时候),但是我们会在这里填写0。 -`glDrawElements`函数从当前绑定到`GL_ELEMENT_ARRAY_BUFFER`目标的EBO获取索引。这意味着我们必须在每次要用索引渲染一个物体时绑定相应的EBO,这还是有点麻烦。不过顶点数组对象仍可以保存索引缓冲对象的绑定状态。VAO绑定之后可以索引缓冲对象,EBO就成为了VAO的索引缓冲对象。再次绑定VAO的同时也会自动绑定EBO。 +glDrawElements函数从当前绑定到GL_ELEMENT_ARRAY_BUFFER目标的EBO中获取索引。这意味着我们必须在每次要用索引渲染一个物体时绑定相应的EBO,这还是有点麻烦。不过顶点数组对象同样可以保存索引缓冲对象的绑定状态。VAO绑定时正在绑定的索引缓冲对象会被保存为VAO的元素缓冲对象。绑定VAO的同时也会自动绑定EBO。 -![](http://learnopengl.com/img/getting-started/vertex_array_objects_ebo.png) +![](../img/01/04/vertex_array_objects_ebo.png) !!! Attention - 当目标是`GL_ELEMENT_ARRAY_BUFFER`的时候,VAO储存了`glBindBuffer`的函数调用。这也意味着它也会储存解绑调用,所以确保你没有在解绑VAO之前解绑索引数组缓冲,否则就没有这个EBO配置了。 + 当目标是GL_ELEMENT_ARRAY_BUFFER的时候,VAO会储存glBindBuffer的函数调用。这也意味着它也会储存解绑调用,所以确保你没有在解绑VAO之前解绑索引数组缓冲,否则它就没有这个EBO配置了。 最后的初始化和绘制代码现在看起来像这样: ```c++ // ..:: 初始化代码 :: .. -// 1. 绑定VAO +// 1. 绑定顶点数组对象 glBindVertexArray(VAO); - -// 2. 把我们的顶点数组复制到一个顶点缓冲中,提供给OpenGL使用 -glBindBuffer(GL_ARRAY_BUFFER, VBO); -glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - -// 3. 复制我们的索引数组到一个索引缓冲中,提供给OpenGL使用 -glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); -glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices),indices, GL_STATIC_DRAW); - -// 3. 设置顶点属性指针 -glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid * )0); -glEnableVertexAttribArray(0); - -// 4. 解绑VAO,不解绑EBO(译注:解绑缓冲相当于没有绑定缓冲,可以在解绑VAO之后解绑缓冲) + // 2. 把我们的顶点数组复制到一个顶点缓冲中,供OpenGL使用 + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + // 3. 复制我们的索引数组到一个索引缓冲中,供OpenGL使用 + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + // 3. 设定顶点属性指针 + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); + glEnableVertexAttribArray(0); +// 4. 解绑VAO(不是EBO!) glBindVertexArray(0); [...] -// ..:: 绘制代码(在游戏循环中) :: .. +// ..:: 绘制代码(游戏循环中) :: .. glUseProgram(shaderProgram); glBindVertexArray(VAO); @@ -508,30 +492,30 @@ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0) glBindVertexArray(0); ``` -运行程序会获得下面这样的图片的结果。左侧图片看起来很熟悉,而右侧的则是使用线框模式(Wireframe Mode)绘制的。线框矩形可以显示出矩形的确是由两个三角形组成的。 +运行程序会获得下面这样的图片的结果。左侧图片看应该起来很熟悉,而右侧的则是使用线框模式(Wireframe Mode)绘制的。线框矩形可以显示出矩形的确是由两个三角形组成的。 -![](http://learnopengl.com/img/getting-started/hellotriangle2.png) +![](../img/01/04/hellotriangle2.png) !!! Important **线框模式(Wireframe Mode)** - 如果用线框模式绘制你的三角,你可以配置OpenGL绘制用的基本图形,调用`glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)`。第一个参数说:我们打算应用到所有的三角形的前面和背面,第二个参数告诉我们用线来绘制。在随后的绘制函数调用后会一直以线框模式绘制三角形,直到我们用`glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)`设置回了默认模式。 + 要想用线框模式绘制你的三角形,你可以通过`glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)`函数配置OpenGL如何绘制图元。第一个参数表示我们打算将其应用到所有的三角形的正面和背面,第二个参数告诉我们用线来绘制。之后的绘制调用会一直以线框模式绘制三角形,直到我们用`glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)`将其设置回默认模式。 -如果你遇到任何错误,回头检查代码,看看是否遗漏了什么。同时,你可以[在这里获得全部源码](http://learnopengl.com/code_viewer.php?code=getting-started/hellotriangle2),也可以在评论区自由提问。 +如果你遇到任何错误,回头检查代码,看看是否遗漏了什么。同时,你可以在[这里](http://learnopengl.com/code_viewer.php?code=getting-started/hellotriangle2)找到全部源码,你也可以在评论区自由提问。 -如果你绘制出了这个三角形或矩形,那么恭喜你,你成功地通过了现代OpenGL最难部分之一:绘制你自己的第一个三角形。这部分很难,因为在可以绘制第一个三角形之前需要很多知识。幸运的是我们现在已经越过了这个障碍,接下来的教程会比较容易理解一些。 +如果你像我这样成功绘制出了这个三角形或矩形,那么恭喜你,你成功地通过了现代OpenGL最难部分之一:绘制你自己的第一个三角形。这部分很难,因为在可以绘制第一个三角形之前你需要了解很多知识。幸运的是我们现在已经越过了这个障碍,接下来的教程会比较容易理解一些。 ## 附加资源 -- [antongerdelan.net/hellotriangle](http://antongerdelan.net/opengl/hellotriangle.html): 一个渲染第一个三角形的教程。 -- [open.gl/drawing](https://open.gl/drawing): Alexander Overvoorde的关于渲染第一个三角形的教程。 +- [antongerdelan.net/hellotriangle](http://antongerdelan.net/opengl/hellotriangle.html):Anton Gerdelan的渲染第一个三角形教程。 +- [open.gl/drawing](https://open.gl/drawing): Alexander Overvoorde的渲染第一个三角形教程。 - [antongerdelan.net/vertexbuffers](http://antongerdelan.net/opengl/vertexbuffers.html): 顶点缓冲对象的一些深入探讨。 # 练习 -为了更好的理解讨论的那些概念最好做点练习。建议在继续下面的主题之前做完这些练习,确保你对这些有比较好的理解。 +为了更好的掌握上述概念,我准备了一些练习。建议在继续下一节的学习之前先做完这些练习,确保你对这些知识有比较好的理解。 -- 尝试使用`glDrawArrays`以在你的数据中添加更多顶点的方式,绘制两个彼此相连的三角形:[参考解答](http://learnopengl.com/code_viewer.php?code=getting-started/hello-triangle-exercise1) -- 现在,使用不同的VAO(和VBO)创建同样的2个三角形,每个三角形的数据要不同(提示:创建2个顶点数据数组,而不是1个):[参考解答](http://learnopengl.com/code_viewer.php?code=getting-started/hello-triangle-exercise2) -- 创建两个着色器程序(Shader Program),第二个程序使用不同的片段着色器,它输出黄色;绘制这两个三角形,其中一个输出为黄色:[参考解答](http://learnopengl.com/code_viewer.php?code=getting-started/hello-triangle-exercise3) +1. 添加更多顶点到数据中,使用glDrawArrays,尝试绘制两个彼此相连的三角形:[参考解答](http://learnopengl.com/code_viewer.php?code=getting-started/hello-triangle-exercise1) +2. 创建相同的两个三角形,但对它们的数据使用不同的VAO和VBO:[参考解答](http://learnopengl.com/code_viewer.php?code=getting-started/hello-triangle-exercise2) +3. 创建两个着色器程序,第二个程序使用与第一个不同的片段着色器,输出黄色;再次绘制这两个三角形,其中一个输出为黄色:[参考解答](http://learnopengl.com/code_viewer.php?code=getting-started/hello-triangle-exercise3) diff --git a/docs/css/style.css b/docs/css/style.css index 1151a59..c5820f9 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -45,8 +45,6 @@ div.admonition code { overflow-x: visible; line-height: 18px; color: #404040; - border: 1px solid rgba(0, 0, 0, 0.2); - background: rgba(255, 255, 255, 0.7); } img { diff --git a/docs/img/01/04/hellotriangle.png b/docs/img/01/04/hellotriangle.png new file mode 100644 index 0000000000000000000000000000000000000000..aab300f0ad203fb42021e6856350401a9dbbc899 GIT binary patch literal 14476 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 YKh&2RYm;YEQYUuxe0A2sa+5i9m literal 0 HcmV?d00001 diff --git a/docs/img/01/04/hellotriangle2.png b/docs/img/01/04/hellotriangle2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e64ceebda77689b2af5cc29e5d53e85f7e06ec6 GIT binary patch literal 13694 zcmch7bySpZ*X~FNhzLpv2#QLVw6ub>NOyNRAl)Sb0s<1!-QC@Sz~k3gUs+~`Qa zC%Vlk8^9locVenGAkdxGtKSCHA^tjK&Sm4>y`^L!V2cd*Xp!I0p-6f?kN+@JxuNlm{iFfOH`GdW#?#29OSw z$I39sGvPSKjj zTm@?G!@(>Cq2C5Qll|yJ143~D>2yAM;t2W>1Hu#8Rp#BHE5w1(0-lN~<*j+jCG4e+ z&R~V6tjtJ8-6u{+hsU9dq#OH!vBfEdh{cNy`}x2JL2r5`MD(l*^YV;z`0+P!y&4r-yhYi2R>7}gKkcz(JoXn1qiLfUx-?jr zqd!IFpJN9VoAKXp31!IE)JHy)q{30LZC*G6fp+UGzm8C&BYT>7&-XiAZVQ}?CR2bs zjl{#OKp?GGPZ<@u%LF>mL7-R3UbMw8N%p_qr*FRb;4A9%SIjdVjt_!QzqJVB2;MUA zd|<6ZlmA|j+PAlulvamn)WAd+JDE9)NKI;02C;M13lwFKjEaRb)n#C)GPQeXplCfHLU{6Zbi znpf|mv3`5|jIq5{u;e*CMz}tt&*W?Q~#7|rrhF)dbZCObvpE_;ZYU_nZyT#>9_ zHZGf8ELX2Lfw*KwLF$)bViQ7>Bh#W)+uFM`U&!7>4JZ#m)B>=;W$71~N#SNzcKTVEu;P<|nyWm3q= z&CH$6#Z=r=geZjMXvw=3iYT(mFXmv3MCK{xCdh2algJzA@MQbt8fRN72&B8Kp8MZa zZGGJ;EtD>sT%x^L-~I?wpQy}{p4=QO&)3e2{TpRT@1(0eZC&&^Xl$W54fEW{s7RGOu{_y4(TxU< z!mX@?%m(2))l;uKFFPctG^j+4L;6q?VDgjlGg-H?2&DM94+RvfCS!BVZ z6C1TW6JJ|q%{n!}P9C^1ohzJ!PqGd~Z>!uayZ!Vg^mgBU-ZpkCOI}i@4(N`okY?)( zp$y$Gx>55VLTd(j(?&&tM6f@ZwreatT?Ds-+tVm-Qj$|jO07%5W96i3GHEh-Uh}-} z=P3Vs&v#G)#xj;E2|B~OPAC#RpFKO7CvfRsu?PZYMNyt z1qlTdV|4{}S$DH)-h{u&OB^$9E#9f@s?4b(Dqfzr2`#JySGwsM>k%4PwH3C)!yCfg zYTbg)`OvWZChz2ts*$?elw0F*D{;@p_Qk^m+}idd*O-h|`f>UvSQjgCAvE7i6XfHD zMU4rKYizvtJ_h`LmBqDeWkZYL9B@;(-*i$B zTM|v8Dyz*vYp2k6+2uh2%%m^R%;)mmrG=!uj4NPInDm)Kl?%p;t1=vNk94;Q`49Q6 zlNR|Gc{yiUW>vL&IGd|Ft02;?mWkRvb3z_ZE)6c7F9$(co)kBXk^Q}1dZ{Cw9y_~| zHw6oDLk$m0C%0aHO0Ic{|1#u#!TaT}1>`23o1Y8Fk6_V#p?#)zd}Q2L#|F@JS9Akg z-EUL*`1vUN3IxCVs6sr*9L4T1I4xu|_v++T7$q74f%{54ad<3pp&_HqM=G?fESvEMP9W5Jod~YQA$y>1)~d$s)*MyhqO+ z`Qr7*H_sz}yu_i+Ciq0Li|arUe9NhYw8i)_(;&y-#|a?~TCz90Vzg4uVVj}#>`qVH zSTpFCYd%ore6D|u^?D|bJCPvP{t=jkkGp}{J1q3Gm0&KpRCuNFy77vUJtW`Ir}U!D zBCv{y>kgBXS)4TZ!O}Z()lXg%;&8RsH6ptO6P4UM-{p^P&!MQ zdue^`e*d-NhWQ4j;;m&Lw~guXElp_^Ce^tL-4ovg5`KLDfI>VdVHCc{1ogDzGKrsM zcT>!CM0rl$w;F?fqamZUm05;F^*fQdQ7ch*EU+f0%CY8@%C`;;2|g%br1_|Qy+?)b6AAe_Xd{*Y~R6slf-bk5(^2vxkHC^c#{ zYIrJsT6QE*=%2fG9C-@XEO-O9+Uh_aLOw@(a;I{z-EXAPs_Jt?!UO6qT9bwEJkzsL9*?)4$pGO;hXisWP%48-OyBjMKCm(yNuBTor z-NQdPwm$28CJKFs9nZ$A>LjtJ&}BNc_I^0rc(?yk!j}X$cgCO7I?&Wg7npwEoEf&| zb}f$W{E+ZvAdIJ;r%z+I+IF`Tx{Rw_tsGm#tqoqcUFW?BAC~T@i?53ijQ0&j52i%zMuj(lT{F(tn>UDxpzST~WQ|>ptjt>b zN~c?29i|;fx6|gZrI%bEc~D=P{46<;AILflCkhY0L_v<;JJV-nfCByIBYiPBDGB(OAvhdt~b!I^c#mLxqI#3Ea%l?u~1_ zDZY?UO4XH489wd7ifsPYjKG?#~K zfoCfBWE7RY_gN@qq{QduzqknY-tAIy5KdE)*&%fh7Ruk2%htaQ%2alq%LtM}PU;*I zPze&ayXEj5rnDDA+Op!y-~VHD1h-f9fN#Fgijm&aG%L6PTH`j?RA0XWhy~VO?(R;_ zg6ql$%}W|3;Q_wePou_sx!YZ(kmY$9TD1?_E^mRf>1HNohgx*`m4OniCnKv@F4`NAA1(-=1 z4~^_J!wOaDIm5yVc^-_@M>g5kG@gXG>2Yu@ZOOVY`Ea*~Nt$1J==@aoEhRn)li0W? zxgI7V5U!%J!9TcZNwlCCBTRgHR*?4fP*z+2a?5R=;}C7CU-(1|(=M@LSpd2Xet>SD z7_#3$u>RnH9UB$ee-eA*gbydbSb6EOQM~t}q}ntpqH3!8&%@;I?1uIK>(PGTi`oynQZ1N%cx#oT8kmrk*(12<(vjr3tr>*8A%r zvj-%(YNrxzecrf|B6HLx*8eKmaKI(-D6gGg8zNQ>(@QsQnPd5GNrF|5*Z4^9sBU%jO=aSZ*A6%*~wVNk(0{sV+p|q8a8gZqd}%Y(0AL zm{b+({9*-q!n0KK zZhSK0{gd5UYi;OHnU06sPc4PCzxVjas5hB!>l$i{8-bgO8X@w~MOfh0EVub~tQc*6 zIn2U=?0Ml9-93)2p+hn(yC4r6od!Dexjjesqn!?c>6*PLTwH#*eA(W~R0=pv`*(=Id<91k{Yao{oN4$`kqm@*zR4c5qQsoSrI)vuRK ziCu2Y&q}8B+04VOJmfu+7hSW>c}MK{2e|L8*W8DbVLM1097#Xjo+_|G+lu2<=OC35 z(9-?k!%9qr#4ufE)NbYMW(j0v-zs!)o~~rD>it#nG-zYxf6A?lSR5@Wvoyx859PVg zGE;RkbJ9!(@5do;_(Be*&VF9nZcQyMEjbJiGZkt4bhqARxEa|{dN3n>0k`Bo2XACN z)VlZ@LWTIbgl}IeyNws8m3uYEGN}2s_L8>K7by)9t=-?P3ihpS7n;FM3BIen_pW&F ziY1cms0Wzut`T9EhxoWK`qojl%oO?5-Fz_raW-6kPxN-mR^s8#W@6wxoath7V5Es^ zg8!b0z{9l$9C#x7Q9Zl}T4V%LubbuiB%G(7!8$QnmM_d zscN2d5g5Ye%W7-Q5n>Pibhzg?9*$CHY5p4z)ehpr>%w zxB%CKgUch2%Z;TakNpOhg8Bl<923A~MI9m*meGY^v7?_dl1=9QT9O8$-8nbr*3`%= zCo9)HvrO3?2K+}OZdkljfDef#58 zIBl(dgMOhK8vXnhJh$;vz%6y^j_5DpT60D1g1%xe`+SZ#6J4krj_va1%xCQBr$lvn zBdWYIlisT8S5idh(`gT`$(12(rD?l)%LB=gQ!EE{p+7gUQ8P^2kcqLm+|hy62(aAc zegG5)cekIr{ii4HF6Sp%U%rgL&ID-i+d6AUpQhW@!VX>MwNp= zqNISpvNJ3pY08>;;CcMaq!}i-Or$d3fg*F@t9VH9V&zK;>gxy_cDZt6o- z@Kr-dqO){OtnZs4cuz!sNk&aPW{`xu*l5V=q`GwPhi|&AzLE;;uv+qsbV9~lJq`9r zEZPhOySNWkSV%*x?UI4@AdRIEfc;eLN_Iz~qyf~Rbqe(olXjk-n0xoqI3xaKZy zg}AFRv+NwtizOdTc$_79#Kp&-^){XBYhETRjJ?w7ZN$wloGvReC(&n;Sj)uQYWtSm zWd7J{yO7;Eu6R2=c4OENldsKhoW``U#o8Q*6j>R#=u@!9ZS01aQkOi2>eeL)3z)&` z;RLvEwqR>wFD%0Bjigpm#bjcc>~^os%628HP-Ziw^1-VgwiV=DtR?BaCE)M`+Lf}7u$y5rDzl$K=Vpy1;hqH($3E^xjO1!V8#u7LX& zr!zb+_B^DTs*vxjQiyC*oa%6^W@|4Wy zaiv+J@$@-wxHMhB$D9~}o~n3HBYRI{wdbe0Q@{@qxgjVChX!k$euAH6YFO={ZBWgf;zUZ^`+f{}HEj zJwu0J<%E{#1$?9(qJF|n8oCN8{B)3bHnMQ*$e+^GCegW^-EsE=Lw(oxAPJuW^*L7o zW`{J2(`5alJEk57W0>PeV4>NYaAj7V$8Sl4v9yDNGw$V)J@kShYSxO;!oJG1j_#XuUu3PDFa*rUZ}e zs^Mt3?f&se#K+nrPxf+(XO4>K&YFe|@Ux&564khnIPO8sps2i3T&{E4N&6KAcmOqZqiYG9kf*|;QIlcvGCCu=5?bOEiE2PO-l zW*(4_MKMu}vnz03!UC?nP-<7Rq03H-2IQpZPXah^xkgD%`3Nn!zvjZ%-4_!8YrLiT z&yG6;&f-EY*S$j;PcJOp55sfESl9iPfaU^4DZM}v7G~?U1ux|WZ!p@tlhm_HC@O)# zyPmD!-Ma8}GEa%EQf1uy@r9J-=B~G~FBXlvvUuA4eRZ2VxzNfDz8cknwD+9C54)>Q zkt^%v9CSkm<2Jap7ESNVaT*7@nALY++9qz9DjxWLQ&`r?;iG%HRTNq&GFHQ)i3S;x zwnK&fyzA5-eslKiZ0%kYQ$b@{+-S(=n08~tKqHMd+-30y83N^vRvZskAFVIQwA)x4 zo0gZVQ7i}zn9^}7sA}x!Fkp2_>^3FYQ{tp?;>jP}>Y{Q!x04clx;`NfgkO?Nwf8?c@B z&H1YOEHj_YY<&k+C9txZQ$ms5(}Uxj{i%7e4$sJ@*4PI2l4`CA{;+C?CWcz68IP7Z zZV8>44PFKzFW<)ZXsW;%lpA9=VbCGdF5#X!?ui5 ztdZrHo?Ky3a+C8pX0Lfhm-9@e7;`bOHTvia$_*{?_ApD;`iv8@t=~==L900rmSS`| z(3v_K7#qNB+pqL@QWkjXRPo7jsQDG*wI@H%a-4kW|7u43g99s_1Iw*T$81i)Y3)6Jn=$Bf9JmWB_r6j3=^2A-H?omyKIfrJ99jY&VMXG2JRjk9 z^T@+}4(yxieoYTlE;7A(GG89`a^{U>l1oF1ljsEU;L1VBDT$JUDRh%=glE0pDT(9y zLY6nx(cB93C%r92oS9J6MUhBhNCn=Fk!2~Y`i<>gGUJZPHFM+694zm+xZlxC@INqF z58JiR8cTpaKQT%+T%Y^t{C2fh2l~0`T%#B~G0sg4=iV;Z#;^@G#@6z`qj8Jv2$j1% zO-MNvIVu{xiDG-fY*ljWzWfQ}%w%u(q>b!aUBnbKfywIWc{5U`ynYkVn+|aIsOLOm z0FJYq9$`Gs3bb_!p17vsXKp2MaH1+*EukLZKzbcA7Wx8eQVeDr=pKDhuPv#KMc-KX zY(_+&$?Aqf-yF-5`DPPWaV%Qdx(o1Xz&cmOasxfXbtF0Ev*Vj>zj$%Fs-T0aCfaz+ zRKpK4>h8@=@yJbc?ezvW0gA~|SS(?+(11zOf|#WuO*}yb1)LPJmhtJ>Zrm3rJ2~*qhfAD3XDL}7z73CX_y9n z{hvIzid&4^?YuUHH^$yw-3oc_n<3(6y|ec2=v%MXD0`xYT$vn>lK+C4>P^oWog7)q zk8f|=C0<(V_;B}=JSK@EKG1jwV*N%dt3iX_MZpftB#|J?dQ=k7nZ;HYQ- zkJbpTB>!J!0FwXN7$Na`@$c>bKj?U6HNpo7Lw+mqpL~I%a^=4NH$U^ zhqMfA%8Q4yzmVT>yjuINio@P+*RGjr<#SRFLY%5sJNSxf8pL)+JA>~$zWnEN6swZ^L%9%a#epKwGv8D+solJj-YLNqz%TKW7~J~ zW9U_xoow-OqIM0JUk-av6r<bfyc4NC)C1L*%V4%@ zO`EOt_S@#-1N-;AgaL>?Dh3>%_ta!6Ue~QBcgEPNo#m}t4aw3gtKhbp^*vGhtMqtW ze1&F|F)-R#`|S;lI_`r+2O3#kB9;}Gd`w}(9HEpF!~z09R$y}gUGY7GpQd${N}+E= zZ~M8f_@tJ~EakXdp~VXoA#MRZf3&n-BsA)I1Q&s^g>MCwC>3SE5i8+)U@vrf#7cZ= z9k)aM7m+ZG+|_&1zMr6ckv^&28tDJhM@hqrot?0+B9Dn?D5rSdv%h{Kg_mmAmK>o5 z62d+!lrch^d1L}u`|FLE2MIG2{5n>JMvN%GjW6scMH`EP3D!ZZSl)JCx-u>edHq%b z&ReVm*(Fv@q{`mFTQiubo-@~??CRh7V+-=cW;F(gIlfbgkW=USbeQQ{=b&nQFd9Q2 z%8KA`lUsmI06jG7%O1(3=jxCgK%Agg34|27g}M7>$`!nrD=i#;BeYWg26y ztgXZN^eVyt#Q~B4U1PbsV~v%^bB6psmoyuz0owp-{vpH*UsOkmeeAKU)3@BM&eC}Q zHQU&48e%$D?0^(Zgg$NfD%w3hA(L$3!-MxmVJ`X7Qxz0<46&4>5t|^qm+zRbxMaM! zE*W6^*npS#SwY0IQ;!eI6+nIonN#Tx>`qexSB+a!W~vuS0Kvb9K;w1rvvMMxJ5z}g zg8QQR=kx(QGgwiZKkvRqA_BB@7d1bGg$r*J1tMoEmh$%Z0a{+|eGOGxKtpIbpO%gB z>&pOIK9j-Y8DRV0QAaW-UTHaHcmtS_kOy5U;ny?#(@}R-hS>-U71K+TOV~`}PsDow z*+2sPhHt4zD4~CMIEP)x_z>}EQ>sLW3VY?>Zrs+0egv_he^WL*7@h`=HFcZF1x$Eg zh!ArfRP=mDSWAxdLq4)+Uv36r1n?$dKLIlTpJ?4x*?DNlU`=giwG$EQE|WBkTdLBbKyS#JEfS7f+aO0ry*F z{F7tjvSWIFyZOoR9W?-!2f6$ENsE^^f2n|qv;oCc$!przO;45N4Nrq~74w_eH8%T& z-UEE`kBCc+3EMaw__M0;)!1 zGUbn!>##h$>HyI5O=B>RoUi0|ttFQrobeB=*x1G-#1r+cYQuaQH8iPv?UN>J6n=Rf z^BR`?@()F7CsKgg@dglY;FOqevp~Er@OP`7{nSt)Vo}rlrPd9Ea#G_OCiavR znCCSlXQqdz^nHe5Eoj$pLA}n2ZH?#JGD(DAfGU$mz6j_6`2|Y^0wmB8Lr$5~TSt*29A)|&FQ!tfyNDL+h0&EBq13Vbx>9YI%&BO;B z9~)>;()_JmtL)fgzfu(idlv>OK@oD;ypxngsqUyf<)k-MUVy;M0O7NrlL0!h0yy#C!a&RPltJQ13zk>R>&-|r=r=Z3HQr` zmm1ZbDVsf|3O-oxAv+P8`q%mLOF>4A(t5$LhZSat3N8-8jO@aW1F6@5{#CYsge_29 z>Htsa`N`ojNBDf&L$xbRK%n{;E`@d4_z3x_XaQ~urk4bN({b>Zo@67w3jfs#R~rCl zO7%AL65{SXxlYrEebHCje9L8s!gDXW^9!O^;oRx-2~h=THG>fF@@Rt^$YsP0vS8PITC-_gP;e1AY~$xicJA)%oUR0l>)lMk-yEkVqttB zb+Z*+zNU-_?^C=SX8jd#F9eNCK{Tqx6bR7QBVU^fRchJ#OHZ-!Q~YBH0QLN8kIk;# zaE{)^N=~B<)|o@&P1;}aKqLadPKjBVQQ{Js-(>Kf@qv|LJG$uzq$Bd59tqIzoxf1b zEuYM{4NqiUyECnVuR0Qh?pOO{ejT=F9|ji%t(M7c0iLG$H|dcz?=tAe4M~EJrKF*w zKau{v9N@y}`Za|YJZ{aJ-z(d&dJpgfMrn`iA3OlGDs?0%ql=ZwenE{2P^4dl@Vb@p zVrLLl4Vf%wFP;7jrv4F^RBnnH{VQL9I9a)&=O5379lRHEn$86G6jur#yqAnOLk}+f zMV?m_AFwT&M&DnS2Sh+|;=6PO1J3a?IRu=q_IOmh5cvoaGF2XhS3{92u*xc6G@SUW z3|)l>^_Pd7MsmS@<@W8i98rsR>He@1N5x8=251YE{DQu+L0$h)|50(KA*1WJ+=f&M zF!Q;4(NEd9N}2f4zwRAoC1kXx##XK14auMrHMZg=i*5URfqn47q{eEcvJX}Y8DX+yafq(bg zKZ4=aTw7-|zn8lESr{5)xb|snKX#EkZ%DEi{y2X6^#kQG;Y)q?uAL&VUpyT*l(7&g$g0Wup_IJ7h zI&Sm>0l^yu*hQ--gC{HyS8*a(C>M!L zszkJZdYyYJiRVhcGx}=D`A=92;v{50U~CbvuC0(Rnm@%ib4B6TZg>Ga1F88zR2LgT z4=@4{^I`j~S-0A&qJ3>3dOi_5p&8I#a_CLKOL!49N9+S!eu3z`(CNQ%UNsz4Z`Hi! zM({?9BA5NPzy1|%B2L1>&r4L`SUPbN|8*hLN-FTwtu?Ka^MOCL7)Z;{+RW`*%MQA4 zZ>$OgTTr$^`7d}IWfS59$31@2VIcb%WX}OUomj7@`g_fZ#_>l*8%m4>X3gg_ht*Q* z{EL497#>qoOsO{kV`s9b?!U$A{8uz)P4a)fKZ(%fTj69EJ&^BEW3~V5dSVQwa`&z` zL005bd)R8rTBT^gl(o335Q4$3DP$oDGblEV_AT#s_NHe~{@%KwUF}ge!09EPIppe1 z8ggW1rmVTwy~b6i4j`He)}mPI+SIo8`ksrm9T1IHC0HrZRhJC7>gpJUdJjL3)@X!{U!PhK?>^PRrFc$-$;9lUPMwaO#us~krG%SHaA_j`sBo$rApbT| zl;rNPz1?5(0gjN^eGtgXB@FZhPV!sWDi^o^Vwt%X;NU~3;5{r$%tp2w6U7|?YZF+b zdVZ}0!psAP1WZ&re<7MXvEAP7hG8s6(#Kxge*nhKoW$JcX@ALcdHGGZn%dV@Zha#f z*?*Y<6KtRanru}5VN8#(zaXi~Ovq?QP4QA*e4rd4qPgY2uUZ8I^t4^}oOSx}Vj9cT zVxGUurcKl3udGmwP{l;CYoGR_lOg9Sa&nN56WNA8#oHF#ih%Mk0 zg-H+q?PcB)&p!<&0?{o}R|nwOM-VE(cEKjo(Cq22!+-MYe4b58tzcNliB#K-VY*z~ zx~956sE6M5T;n*ojYy*GU}d#D9UAwqTI|)_@-Y7D;EPeJfzLs3+>6pzVFEl7;i@wD%{uSt1uTXo-cw2koC}a>N<$UD zkMZd%15NW~*Q$j0U0R`bC;QR)dl13Q4xl(~Fsg3KD0S@`%&&KKXN0#wysGPK)4AWC zVTK1@O}{K0n-_RVnJbqqeq>Em8mW0fOMCTuk5n|e1RFbc$9c3)X8WRoQD0-L9AlDu z**WBYUIGS3bP((3I^3JA$W|D{xZyrNsVxo!UUr=Hc%$D8=1n>s>2;9cudSNP=^%1< zS;pFJCBmv@3@j*%;Zr0aWyo%;(w2MKo;xPa!!nzc?8bC4S7Trr*eV%NE~D_UdbeuVyeGJKT`zh~wDa@-$2{%?$@s~wQceMW1CjMOOtfX5s3 zgAJ+Jun*iFmUr^4+@2fz!|@BTJ&E)(dMjJZ&TE_36UDf-8hZ3pbt?+-P=E&$k#8M^ z2|v0YphyyaWSsnQYaFflc1eqwrcudL(xN*K($jb<7i06E)`Qa*M}emeT^XQfPoCl{ zXGM&k#@>9tl_u|nZ$i4mj+GuUPKB>*13b~d1HN_9k$3eq#e!B&)X1t5fdTFZ@K|(* zAmrxPgM4?_@9(i60AEkYM1st*Y?`kpaXY|HK+)oqNCmCHbD4f5h~^;9MjhVzePmA} zx*;3#gI6|6Zv7*tBp{vkfCEiyWj0q)y6kt#Y?M)BNX?(V$Y~YfD^U_CW<-qIu!DLG h-~l29$qScQAn!rlH*buY)j+_HxbT}-g@QWo{|{^))6oC` literal 0 HcmV?d00001 diff --git a/docs/img/01/04/ndc.png b/docs/img/01/04/ndc.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b8b0575f049780fb2e905488793543d70853ee GIT binary patch literal 27440 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 E08QHjB>(^b literal 0 HcmV?d00001 diff --git a/docs/img/01/04/pipeline.png b/docs/img/01/04/pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec9b568f0ec97572a7d5daedfefd948af560cd9 GIT binary patch literal 59604 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≫SRwd0{W)Te*l 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%0D}8(45LA4GnJvjP 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 literal 0 HcmV?d00001 diff --git a/docs/img/01/04/vertex_array_objects_ebo.png b/docs/img/01/04/vertex_array_objects_ebo.png new file mode 100644 index 0000000000000000000000000000000000000000..283ffe51b72d9488b14b97b327e8225a98f6b128 GIT binary patch literal 36198 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 literal 0 HcmV?d00001 diff --git a/docs/img/01/04/vertex_attribute_pointer.png b/docs/img/01/04/vertex_attribute_pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..2a2fcb56126be7d8dd46975e28ae2bc1ae8f36c0 GIT binary patch literal 9997 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 YjFeqw!5`wz5CH(7g8J)fIrGr}0I@M?aR2}S literal 0 HcmV?d00001 diff --git a/glossary.md b/glossary.md index 9b8e1b8..5033187 100644 --- a/glossary.md +++ b/glossary.md @@ -69,4 +69,18 @@ - Normalized Device Coordinates:标准化设备坐标,NDC - Position:位置 - Coordinate Space:坐标空间 -- Screen-space Coordinates:屏幕空间坐标 \ No newline at end of file +- Screen-space Coordinates:屏幕空间坐标 +- VBO:Vertex Buffer Objects,顶点缓冲对象 +- Vertex Attribute:顶点属性 +- Position:位置 +- Location:位置值 +- Vector:向量 +- Perspective Division:透视划分 +- Fragment Shader:片段着色器 +- Component:分量 +- Normalize:标准化 +- Stride:步长 +- Offset:偏移量 +- VAO:顶点数组对象,Vertex Array Object +- Element Buffer Object,Index Buffer Object:EBO,IBO,索引缓冲对象 +- Wireframe Mode:线框模式 \ No newline at end of file diff --git a/docs/img/01/04/OpenGL_pipline_cn.png b/old/img/OpenGL_pipline_cn.png similarity index 100% rename from docs/img/01/04/OpenGL_pipline_cn.png rename to old/img/OpenGL_pipline_cn.png