1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 04:35:28 +08:00

Replace html with tags

This commit is contained in:
Meow J
2015-07-11 21:09:55 +08:00
parent db7a0d06a5
commit 6edab0e657
7 changed files with 92 additions and 71 deletions

View File

@@ -4,9 +4,9 @@
在OpenGL中任何事物都在3D空间中但是屏幕和窗口是一个2D像素阵列所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你的屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的**图形输送管道**(pipeline大多译为管线实际上指的是一堆原始图形数据途经一个输送管道期间经过各种变化处理最终出现在屏幕的过程)管理的。图形输送管道可以被划分为两个主要部分第一个部分把你的3D坐标转换为2D坐标第二部分是把2D坐标转变为实际的有颜色的像素。这个教程里我们会简单地讨论一下图形输送管道以及如何使用它创建一些像素这对我们来说是有好处的。
<div style="border:solid #AFDFAF;border-radius:10px;background-color:#D8F5D8;margin:10px 10px 10px 0px;padding:10px">
2D坐标和像素也是不同的2D坐标是在2D空间中的一个点的非常精确的表达2D像素是这个点的近似它受到你的屏幕/窗口解析度的限制。
</div>
!!! Important
2D坐标和像素也是不同的2D坐标是在2D空间中的一个点的非常精确的表达2D像素是这个点的近似它受到你的屏幕/窗口解析度的限制。
图形输送管道接收一组3D坐标然后把它们转变为你屏幕上的有色2D像素。图形输送管道可以被划分为几个阶段每个阶段需要把前一个阶段的输出作为输入。所有这些阶段都是高度专门化的它们有一个特定的函数它们能简单地并行执行。由于它们的并行执行的特征当今大多数显卡都有成千上万的小处理核心在GPU上为每一个输送管道的阶段运行各自的小程序从而在图形输送管道中快速处理你的数据。这些小程序叫做**着色器**(Shader)。
@@ -22,9 +22,9 @@
①译注:当我们谈论一个“位置”的时候它代表在一个“空间”中所处地点的这个特殊属性同时“空间”代表着任何一种坐标系比如x、y、z三维坐标系x、y二维坐标系或者一条直线上的x和y的线性关系只不过二维坐标系是一个扁扁的平面空间而一条直线是一个很瘦的长长的空间。
<div style="border:solid #AFDFAF;border-radius:10px;background-color:#D8F5D8;margin:10px 10px 10px 0px;padding:10px">
为了让OpenGL知道我们的坐标和颜色值构成的到底是什么OpenGL需要你去提示你希望这些数据所表示的是什么类型。我们是希望把这些数据渲染成一系列的点一系列的三角形还是仅仅是一个长长的线做出的这些提示叫做**基本图形**(Primitives)任何一个绘制命令的调用都必须把基本图形类型传递给OpenGL。这是其中的几个`GL_POINTS``GL_TRIANGLES``GL_LINE_STRIP`
</div>
!!! Important
为了让OpenGL知道我们的坐标和颜色值构成的到底是什么OpenGL需要你去提示你希望这些数据所表示的是什么类型。我们是希望把这些数据渲染成一系列的点一系列的三角形还是仅仅是一个长长的线做出的这些提示叫做**基本图形**(Primitives)任何一个绘制命令的调用都必须把基本图形类型传递给OpenGL。这是其中的几个`GL_POINTS``GL_TRIANGLES``GL_LINE_STRIP`
输送管道的第一个部分是**顶点着色器**(Vertex Shader)它把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转为另一种3D坐标后面会解释同时顶点着色器允许我们对顶点属性进行一些基本处理。
@@ -38,9 +38,9 @@
②译注Fragment通常译为片段但从根本上来说它就是带有一些额外信息的像素由于带有额外信息OpenGL就没有给它取名叫“像素”所以“片段”的中文译法比较不准确听起来就像一个fragment可能包含多个像素一样实际上一个fragment只包含一个像素现在你只要简单记住它是像素就行了。后面你会知道除了像素信息以外它还包含了什么。
<div style="border:solid #AFDFAF;border-radius:10px;background-color:#D8F5D8;margin:10px 10px 10px 0px;padding:10px">
OpenGL中的一个fragment是OpenGL渲染一个独立像素所需的所有数据。
</div>
!!! Important
OpenGL中的一个fragment是OpenGL渲染一个独立像素所需的所有数据。
**片段着色器**的主要目的是计算一个像素的最终颜色这也是OpenGL高级效果产生的地方。通常片段着色器包含用来计算像素最终颜色的3D场景的一些数据比如光照、阴影、光的颜色等等
@@ -68,17 +68,17 @@ GLfloat vertices[] = {
③译注通常深度可以理解为z坐标它代表一个像素在空间中和你的距离如果离你远就可能被别的像素遮挡你就看不到它了它会被丢弃以节省资源。
<div style="border:solid #AFDFAF;border-radius:10px;background-color:#D8F5D8;margin:10px 10px 10px 0px;padding:10px">
**标准化设备坐标**
!!! Important
一旦你的顶点坐标已经在顶点着色器中处理过,它们就应该是**标准化设备坐标**了标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪不会显示在你的屏幕上。下面你会看到我们定义的在标准化设备坐标中的三角形忽略z轴
**标准化设备坐标**
![](http://www.learnopengl.com/img/getting-started/ndc.png)
一旦你的顶点坐标已经在顶点着色器中处理过,它们就应该是**标准化设备坐标**了标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪不会显示在你的屏幕上。下面你会看到我们定义的在标准化设备坐标中的三角形忽略z轴
与通常的屏幕坐标不同y轴正方向上的点和0, 0坐标是这个图像的中心而不是左上角。最后你希望所有变换过的坐标都在这个坐标空间中否则它们就不可见了。
![](http://www.learnopengl.com/img/getting-started/ndc.png)
你的标准化设备坐标接着会变换为**屏幕空间坐标**screen-space coordinates这是使用你通过`glViewport`函数提供的数据,进行**视口变换**viewport transform完成的。最后的屏幕空间坐标被变换为像素输入到片段着色器
</div>
与通常的屏幕坐标不同y轴正方向上的点和0, 0坐标是这个图像的中心而不是左上角。最后你希望所有变换过的坐标都在这个坐标空间中否则它们就不可见了
你的标准化设备坐标接着会变换为**屏幕空间坐标**Screen-space Coordinates这是使用你通过`glViewport`函数提供的数据,进行**视口变换**Viewport Transform完成的。最后的屏幕空间坐标被变换为像素输入到片段着色器。
有了这样的顶点数据我们会把它作为输入发送给图形输送管道的第一个处理阶段顶点着色器。它会在GPU上创建储存空间用于储存我们的顶点数据还要配置OpenGL如何解释这些内存并且指定如何发送给显卡。顶点着色器接着会处理我们告诉它要处理内存中的顶点的数量。