proofread

pull/70/head
tornoteli 8 years ago
parent d2caf1cb1d
commit 0795b12991

@ -3,42 +3,42 @@
<canvas id="custom" class="canvas" data-fragment-url="cmyk-halftone.frag" data-textures="vangogh.jpg" width="700px" height="320px"></canvas>
上面两幅图由不同的方式制成。第一张是梵高用手一层一层画出来的,需要花费些时间。第二张则是用一些【?像素矩阵的组合】生成的:一个青色,一个品红,一个黄色,和一个黑色。关键的区别在于第二张图是用非序列方式实现的(即不是一步一步实现,而是多个同时进行)。
上面两幅图由不同的方式制成。第一张是梵高一层一层徒手画出来的,需要花费些时间。第二张则是用 4 个像素矩阵分秒钟生成的:一个青色,一个品红,一个黄色,和一个黑色矩阵。关键的区别在于第二张图是用非序列方式实现的(即不是一步一步实现,而是多个同时进行)。
这本书是关于这个革命性的计算机技术片段着色器fragment shaders它将数字生成的图像带到了新的层面。类似于当年古腾堡的印刷术。
这本书是关于这个革命性的计算机技术片段着色器fragment shaders它将数字生成的图像提到了新的层次。你可以把它看做当年的古腾堡印刷术。
![Gutenberg's press](gutenpress.jpg)
Fragment shaders片段着色器可以让你控制像素在屏幕上的快速渲染。这就是为什么 shader 在各种场合被广泛使用的原因不管是在手机的视频过滤器还是酷炫的的3D视频游戏中
Fragment shaders片段着色器可以让你控制像素在屏幕上的快速渲染。这就是它在各种场合被广泛使用的原因从手机的视频滤镜到酷炫的的3D视频游戏
![Journey by That Game Company](journey.jpg)
在接下来的章节你会发现 shader 是多么难以置信地快速和强大,还有如何将它应用到专业的和个人的作品中。
在接下来的章节你会发现这项技术是多么难以置信地快速和强大,还有如何将它应用到专业的和个人的作品中。
## 这本书是为谁而写的?
这本书是写给有线性代数和三角学的基本知识的创意编程者、游戏开发者和工程师的,还有那些想要提升他们的作品的图质量到一个令人激动的新层次的人。(如果你想要学习编程,我强烈推荐你先学习[Processing](https://processing.org/)等你玩起来processing再回来看这个
这本书是写给有代码经验和线性代数、三角学的基本知识的创意编程者、游戏开发者和工程师的,还有那些想要提升他们的作品的图质量到一个令人激动的新层次的人。(如果你想要学习编程,我强烈推荐你先学习[Processing](https://processing.org/)等你玩起来processing再回来看这个
这本书会教你如何使用shaders并把它整合进你的项目里以提升作品的表现力和图形质量。因为GLSLOpenGL的绘制语言的shaders 在很多平台都可以编译和运行你将可以把在这里学的运用到任何使用OpenGL, OpenGL ES 和 WebGL 的环境中。也就是说,你将可以把学到的知识应用到[Processing](https://processing.org/)[openFrameworks](http://openframeworks.cc/)[Cinder](http://libcinder.org/)[Three.js](http://threejs.org/)和iOS/Android游戏中。
这本书会教你如何使用 shaders(着色器)并把它整合进你的项目里以提升作品的表现力和图形质量。因为GLSLOpenGL的绘制语言的shaders 在很多平台都可以编译和运行你将可以把在这里学的运用到任何使用OpenGL, OpenGL ES 和 WebGL 的环境中。也就是说,你将可以把学到的知识应用到[Processing](https://processing.org/)[openFrameworks](http://openframeworks.cc/)[Cinder](http://libcinder.org/)[Three.js](http://threejs.org/)和iOS/Android游戏中。
## 这本书包含哪些内容?
这本书将会专注于GLSL像素着色。首先我们会给出shaders的定义然后我们会学习如何制作可被程序执行的形状,图案,材质,和与之相关的动画。你将会学到基础的着色语言并把它们应用到有用的情景中,比如:图像加工图像运算矩阵卷积模糊颜色过滤查找表及其他效果和模拟Conway的生命游戏Gray-Scott反应扩散水波水彩效果Voronoi细胞等等。到书的最后我们讲看到一系列基于光线行进的进阶技术。
这本书专门关于 GLSL pixel shaders。首先我们会给出shaders的定义然后我们会学习如何制作程序里的形状,图案,材质,和与之相关的动画。你将会学到基础的着色语言并把它们应用到有用的情景中,比如:图像处理图像运算矩阵卷积模糊颜色滤镜查找表及其他效果和模拟Conway 的生命游戏Gray-Scott 反应扩散水波水彩效果Voronoi 细胞等等。到书的最后我们将看到一系列基于光线跟踪Ray Marching的进阶技术。
**每章都会有可以玩的交互的例子。**当你改动代码的时候,你会立刻看到这些变化。一些概念可能会晦涩难懂,而这些可交互的例子会对你学习这些材料非常有益。你越快把这些代码付诸实践,你学习的过程就会越容易。
这本书里不包括的内容有:
* 这**不是**一本openGL或webGL的书。OpenGL/webGL是一个比GLSL或fragment shaders更大的主题。如果你想要学习openGL/webGL推荐看 [OpenGL Introduction](https://open.gl/introduction), [the 8th edition of the OpenGL Programming Guide](http://www.amazon.com/OpenGL-Programming-Guide-Official-Learning/dp/0321773039/ref=sr_1_1?s=books&ie=UTF8&qid=1424007417&sr=1-1&keywords=open+gl+programming+guide) (也被叫做红宝书) 或 [WebGL: Up and Running](http://www.amazon.com/WebGL-Up-Running-Tony-Parisi/dp/144932357X/ref=sr_1_4?s=books&ie=UTF8&qid=1425147254&sr=1-4&keywords=webgl)
* 这**不是**一本 openGL webGL 的书。OpenGL/webGL 是一个比GLSL fragment shaders 更大的主题。如果你想要学习 openGL/webGL 推荐看: [OpenGL Introduction](https://open.gl/introduction), [the 8th edition of the OpenGL Programming Guide](http://www.amazon.com/OpenGL-Programming-Guide-Official-Learning/dp/0321773039/ref=sr_1_1?s=books&ie=UTF8&qid=1424007417&sr=1-1&keywords=open+gl+programming+guide) (也被叫做红宝书) 或 [WebGL: Up and Running](http://www.amazon.com/WebGL-Up-Running-Tony-Parisi/dp/144932357X/ref=sr_1_4?s=books&ie=UTF8&qid=1425147254&sr=1-4&keywords=webgl)
* 这**不是**一本数学书。虽然我们会涉及到很多关于线代和三角学的算法和技术,但我们不会详细解释它。关于数学的问题我推荐手边备一本:[3rd Edition of Mathematics for 3D Game Programming and computer Graphics](http://www.amazon.com/Mathematics-Programming-Computer-Graphics-Third/dp/1435458869/ref=sr_1_1?ie=UTF8&qid=1424007839&sr=8-1&keywords=mathematics+for+games) 或 [2nd Edition of Essential Mathematics for Games and Interactive Applications](http://www.amazon.com/Essential-Mathematics-Games-Interactive-Applications/dp/0123742978/ref=sr_1_1?ie=UTF8&qid=1424007889&sr=8-1&keywords=essentials+mathematics+for+developers)。
## 开始学习需要什么准备?
没什么。如果你有可以运行WebGL的浏览器像ChromeFirefox或Safari和网络点击页面底端的“下一章”按钮就可以开始了。
没什么。如果你有可以运行 WebGL 的浏览器像ChromeFirefox或Safari和网络点击页面底端的“下一章”按钮就可以开始了。
此外,基于你有的条件或需求你可以:

@ -7,7 +7,7 @@
如果你曾经有用计算机绘图的经验,你就知道在这个过程中你需要画一个圆,然后一个长方形,一条线,一些三角形……直到画出你想要的图像。这个过程很像用手写一封信或一本书 —— 都是一系列的指令,需要你一件一件完成。
Shaders 也是一系列的指令,但是这些指令会对屏幕上的每个像素同时下达。也就是说,你的代码必须根据像素在屏幕上的不同位置,表现出不同的样貌。就像活字印刷,你的程序就像一个 function函数输入位置信息输出颜色信息当它编译完之后会以相当快的速度运行。
Shaders 也是一系列的指令,但是这些指令会对屏幕上的每个像素同时下达。也就是说,你的代码必须根据像素在屏幕上的不同位置执行不同的操作。就像活字印刷,你的程序就像一个 function函数输入位置信息输出颜色信息当它编译完之后会以相当快的速度运行。
![Chinese movable type](typepress.jpg)
@ -15,7 +15,7 @@ Shaders 也是一系列的指令,但是这些指令会对屏幕上的每个像
为了回答这个问题,不得不给大家介绍**并行处理**parallel processing的神奇之处。
想象你的 CPU 是一个大的工业管道,然后每一个任务都是通过这个管道的某些东西 —— 就像一个生产流水线那样。有些任务要比别的大,也就是说要花费更多时间和精力去处理。我们就称它要求更强的处理能力。因为计算机自身架构的原因,这些任务需要串行;即一次一个地依序完成。现代计算机通常有一组四个处理器,就像这个管道一样运行,一个接一个地处理这些任务,从而使计算机流畅运行。每个管道通常被称为**线程**。
想象你的 CPU 是一个大的工业管道,然后每一个任务都是通过这个管道的某些东西 —— 就像一个生产流水线那样。有些任务要比别的大,也就是说要花费更多时间和精力去处理。我们就称它要求更强的处理能力。由于计算机自身的架构,这些任务需要串行;即一次一个地依序完成。现代计算机通常有一组四个处理器,就像这个管道一样运行,一个接一个地处理这些任务,从而使计算机流畅运行。每个管道通常被称为**线程**。
![CPU](00.jpeg)
@ -35,14 +35,14 @@ Shaders 也是一系列的指令,但是这些指令会对屏幕上的每个像
## GLSL是什么
GLSL 代表 openGL Shading LanguageopenGL 着色语言这是你在接下来章节看到的程序所遵循的具体标准。根据硬件和操作系统的不同还有其他的着色器shaders)。这里我们将依照[Khronos Group](https://www.khronos.org/opengl/)的规则来执行。了解 OpenGL的历史将有助于你理解大多数奇怪的约定所以建议不妨阅读[openglbook.com/chapter-0-preface-what-is-opengl.html](http://openglbook.com/chapter-0-preface-what-is-opengl.html)。
GLSL 代表 openGL Shading LanguageopenGL 着色语言这是你在接下来章节看到的程序所遵循的具体标准。根据硬件和操作系统的不同还有其他的着色器shaders)。这里我们将依照[Khronos Group](https://www.khronos.org/opengl/)的规则来执行。了解 OpenGL 的历史将有助于你理解大多数奇怪的约定,所以建议不妨阅读[openglbook.com/chapter-0-preface-what-is-opengl.html](http://openglbook.com/chapter-0-preface-what-is-opengl.html)。
## 为什么 Shaders 有名地不好学?
就像蜘蛛侠里的那句名言,欲戴其冠必承其重并行计算也是如此GPU 的强大的架构设计也有其限制与不足。
就像蜘蛛侠里的那句名言,能力越大责任越大并行计算也是如此GPU 的强大的架构设计也有其限制与不足。
为了能使许多管线并行运行,每一个线程必须与其他的相独立。我们称这些线程对于其他线程在进行的运算是“盲视”的。这个限制就会使得所有数据必须以相同的方向流动。所以就不可能检查其他线程的输出结果,修改输入的数据,或者把一个线程的输出结果输入给另一个线程。如果允许线程到线程的数据流动将使所有的数据面临威胁。
并且 GPU 会让所有并行的微处理器(管道们)一直处在忙碌状态;只要它们一有空闲就会接到新的信息。一个线程不可能知道它前一刻在做什么。它可能是在画操作系统界面上的一个按钮,然后渲染了游戏中的一部分天空,然后显示了一封 email 中的一些文字。每个线程不仅是“盲视”的,而且还是“无记忆”的。同时,它要求编写一个通用的规则,依据像素的不同位置依次输出不同的结果。这种抽象性,和盲视、无记忆的限制使得 shaders 在程序员新中不是很受欢迎。
并且 GPU 会让所有并行的微处理器(管道们)一直处在忙碌状态;只要它们一有空闲就会接到新的信息。一个线程不可能知道它前一刻在做什么。它可能是在画操作系统界面上的一个按钮,然后渲染了游戏中的一部分天空,然后显示了一封 email 中的一些文字。每个线程不仅是“盲视”的,而且还是“无记忆”的。同时,它要求编写一个通用的规则,依据像素的不同位置依次输出不同的结果。这种抽象性,和盲视、无记忆的限制使得 shaders 在程序员新中不是很受欢迎。
但是不要担心!在接下来的章节中,我们会一步一步地,由浅入深地学习着色语言。如果你是在用一个靠谱的浏览器阅读这个教程,你会喜欢边读边玩书中的示例的。好了,不要再浪费时间了,赶快去玩起来吧! 点击**Next >>**开启 shader 之旅!
但是不要担心!在接下来的章节中,我们会一步一步地,由浅入深地学习着色语言。如果你是在用一个靠谱的浏览器阅读这个教程,你会喜欢边读边玩书中的示例的。好了,不要再浪费时间了,赶快去玩起来吧! 点击 **Next >>** 开启 shader 之旅!

@ -2,7 +2,7 @@
“Hello world!”通常都是学习一个新语言的第一个例子。这是一个非常简单,只有一行的程序。它既是一个热情的欢迎,也传达了编程所能带来的可能性。
然而在 GPU 的世界里,第一步就渲染一行文字太难了,所以我们改为选择一个鲜艳的欢迎色,躁起来!
然而在 GPU 的世界里,第一步就渲染一行文字太难了,所以我们改为选择一个鲜艳的欢迎色,来吧躁起来!
<div class="codeAndCanvas" data="hello_world.frag"></div>
@ -10,15 +10,15 @@
尽管这几行简单的代码看起来不像有很多内容,我们还是可以据此推测出一些知识点:
1. shader 语言 有一个 ```main``` 函数会在最后返回颜色值。这点和C语言很像。
1. shader 语言 有一个 ```main``` 函数,会在最后返回颜色值。这点和 C 语言很像。
2. 最终的像素颜色取决于预设的全局变量 ```gl_FragColor```。
3. 这个C系语言有内建的**变量**(像```gl_FragColor```**函数**和**数据类型**。在本例中我们刚刚介绍了```vec4```(四分量浮点向量)。之后我们会见到更多的类型,像 ```vec3``` (三分量浮点向量)和 ```vec2``` (二分量浮点向量),还有非常著名的:```float```(单精度浮点型), ```int```(整型) 和 ```bool```(布尔型)。
3. 这个类 C 语言有内建的**变量**(像```gl_FragColor```**函数**和**数据类型**。在本例中我们刚刚介绍了```vec4```(四分量浮点向量)。之后我们会见到更多的类型,像 ```vec3``` (三分量浮点向量)和 ```vec2``` (二分量浮点向量),还有非常著名的:```float```(单精度浮点型), ```int```(整型) 和 ```bool```(布尔型)。
4. 如果我们仔细观察 ```vec4``` 类型,可以推测这四个变元分别响应红,绿,蓝和透明度通道。同时我们也可以看到这些变量是**规范化**的意思是它们的值是从0到1的。之后我们会学习如何规范化变量使得在变量间**map**(映射)数值更加容易。
5. 另一个可以从本例看出来的很重要的 C 语言特征是,预处理程序的宏指令。宏指令是预编译的一部分。有了宏才可以 ```#define``` (定义)全局变量和进行一些基础的条件运算(通过使用 ```#ifdef``` 和 ```#endif```)。所有的宏都以 ```#``` 开头。预编译会在编译前一刻发生,把所有的命令复制到 ```#defines``` 里,检查```#ifdef``` 条件句是否已被定义, ```#ifndef``` 条件句是否没有被定义。在我们刚刚的“hello world!”的例子中我们在第2行检查了 ```GL_ES``` 是否被定义,这个通常用在移动端或浏览器的编译中。
5. 另一个可以从本例看出来的很重要的 C 语言特征是,预处理程序的宏指令。宏指令是预编译的一部分。有了宏才可以 ```#define``` (定义)全局变量和进行一些基础的条件运算(通过使用 ```#ifdef``` 和 ```#endif```)。所有的宏都以 ```#``` 开头。预编译会在编译前一刻发生,把所有的命令复制到 ```#defines``` 里,检查```#ifdef``` 条件句是否已被定义, ```#ifndef``` 条件句是否没有被定义。在我们刚刚的“hello world!”的例子中我们在第2行检查了 ```GL_ES``` 是否被定义,这个通常用在移动端或浏览器的编译中。
6. ```float```类型在 shaders 中非常重要,所以**精度**非常重要。更低的精度会有更快的渲染速度,但是会以质量为代价。你可以选择每一个浮点值的精度。在第一行(```precision mediump float;```)我们就是设定了所有的浮点值都是中等精度。但我们也可以选择把这个值设为“低”(```precision lowp float;```)或者“高”(```precision highp float;```)。
@ -32,9 +32,9 @@ void main() {
现在我们已经基本讨论完了“hello world!”例子中所有主要的内容,是时候点击代码,检验一下我们所学的知识了。你会发现出错时程序会编译失败,只留一个寂寞的白屏。你可以试试一些好玩的小点子,比如说:
* 把单精度浮点值换成整型数值,猜猜你的显卡能不能忍这个行为。
* 把单精度浮点值换成整型数值,猜猜你的显卡能不能忍这个行为。
* 试试把第六行 comment 掉,不给函数赋任何像素的值。
* 试试把第六行注释掉,不给函数赋任何像素的值。
* 尝试另外写个函数,返回某个颜色,然后把 ```main()``` 放到这个函数里面。给个提示,这个函数应该长这样:

@ -38,13 +38,13 @@ GLSL 还有更多惊喜。GPU 的硬件加速支持我们使用角度,三角
## gl_FragCoord
就像 GLSL 有个默认输出值 ```vec4 gl_FragColor``` 一样,它也有一个默认输入值( ```vec4 gl_FragCoord``` )。``` gl_FragCoord```存储了活动线程正在处理的**像素**或**屏幕片**的坐标。有了它我们就知道了屏幕上的哪一个线程正在运转。为什么我们不叫 ``` gl_FragCoord``` uniform (统一值)呢?因为每个像素的坐标都不同,所以我们把它叫做**varying**(变化值)。
就像 GLSL 有个默认输出值 ```vec4 gl_FragColor``` 一样,它也有一个默认输入值( ```vec4 gl_FragCoord``` )。``` gl_FragCoord```存储了活动线程正在处理的**像素**或**屏幕片**的坐标。有了它我们就知道了屏幕上的哪一个线程正在运转。为什么我们不叫 ``` gl_FragCoord``` uniform (统一值)呢?因为每个像素的坐标都不同,所以我们把它叫做 **varying**(变化值)。
<div class="codeAndCanvas" data="space.frag"></div>
上述代码中我们用 ```gl_FragCoord.xy``` 除以 ```u_resolution```,对坐标进行了**规范化**。这样做是为了使所有的值落在 ```0.0``` 到 ```1.0``` 之间,这样就可以轻松把 X 或 Y 的值映射到红色或者绿色通道。
在 shader 的领域我们没有太多要 debug 的,更多地是试着给变量赋一些很炫的颜色,试图做出一些效果。有时你会觉得用 GLSL 编程就像是把一搜船放到了瓶子里。它同地困难、美丽而令人满足。
在 shader 的领域我们没有太多要 debug 的,更多地是试着给变量赋一些很炫的颜色,试图做出一些效果。有时你会觉得用 GLSL 编程就像是把一搜船放到了瓶子里。它同地困难、美丽而令人满足。
![](08.png)
@ -58,4 +58,4 @@ GLSL 还有更多惊喜。GPU 的硬件加速支持我们使用角度,三角
* 你可以用 ```u_time``` 和 ```u_mouse``` 来改变颜色的图案吗?不妨琢磨一些有趣的途径。
经过这些小练习后,你可能会好奇还能用 shader 大法做什么。接下来的章节你会知道如何把你的 shader 和 three.jsProcessing和 openFrameworks 结合起来。
经过这些小练习后,你可能会好奇还能用强大的 shader 做什么。接下来的章节你会知道如何把你的 shader 和 three.jsProcessing和 openFrameworks 结合起来。

@ -2,7 +2,7 @@
现在你可能跃跃欲试,想在你熟悉的平台上小试牛刀了。接下来会有一些比较流行的平台的示例代码,展示如何在这些平台上配置 shader。在这个 [github 仓库](https://github.com/patriciogonzalezvivo/thebookofshaders/tree/master/04) 中有本章的三种平台的示例代码)
**注释 1**:如果你不想用这些平台来运行 shader且你想在浏览器外使用 shader你可以下载[glslViewer](https://github.com/patriciogonzalezvivo/glslViewer)。这个 MacOS +树莓派程序直接在终端运行,并且是为本书的例子量身打造的。
**注释 1**:如果你不想用这些平台来运行 shader且你想在浏览器外使用 shader你可以下载[glslViewer](https://github.com/patriciogonzalezvivo/glslViewer)。这个 MacOS+树莓派程序直接在终端运行,并且是为本书的例子量身打造的。
**注释2**:如果你想用 WebGL 显示 shader并不关心其他平台你可以用[glslCanvas](https://github.com/patriciogonzalezvivo/glslCanvas) 。这个 web 工具本来是为本书设计的,但是太好用了,所以我常常用在其他项目中。

@ -13,7 +13,7 @@
这些代码就是你的基本功;遵守和理解它非常重要。你将会一遍又一遍地回到 0.0 到 1.0 这个区间。你将会掌握融合与构建这些代码的艺术。
这些 x 与 y或亮度之间一对一的关系称作**线性插值**linear interpolation译者注插值是离散函数逼近的重要方法利用它可通过函数在有限个点处的取值状况估算出函数在其他点处的近似值。因为对机器运算来说,屏幕像素注定是离散的而不是连续的,计算机图形学常用插值来填充图像变换时像素之间的空隙。)现在起我们可以用一些数学函数来改造这些代码行。比如说我们可以做一个求 x 的 5 次幂的曲线。
这些 x 与 y或亮度之间一对一的关系称作**线性插值**linear interpolation译者注插值是离散函数逼近的重要方法利用它可通过函数在有限个点处的取值状况估算出函数在其他点处的近似值。因为对计算机来说,屏幕像素是离散的而不是连续的,计算机图形学常用插值来填充图像像素之间的空隙。)现在起我们可以用一些数学函数来改造这些代码行。比如说我们可以做一个求 x 的 5 次幂的曲线。
<div class="codeAndCanvas" data="expo.frag"></div>

@ -10,7 +10,7 @@
</div>
## 关于翻译
这本书是 Patricio 的 Book of Shaders 的中文翻译。我们希望借此将 Shader 这个有趣有益的工具介绍给更多国人。能力所限,不免有误,如有翻译不当,也请多多指出。
这本书是 Patricio 的 the Book of Shaders 的中文翻译。我们希望借此将 Shader 这个有趣有益的工具介绍给更多国人。能力所限,不免有误,如有翻译不当,也请多多指出。
感谢 Patricio 对我们的翻译的信任和支持。
@ -22,7 +22,7 @@
* [什么是片段着色器Fragment Shader](01/?lan=ch)
* [“Hello world!”](02/?lan=ch)
* [Uniforms值](03/?lan=ch)
* [运行你的shader](04/?lan=ch)
* [运行你的 shader](04/?lan=ch)
* 用算法绘画
* [造型函数](05/?lan=ch)
@ -32,22 +32,22 @@
* [图案](09/?lan=ch)
* 生成设计
* [Random函数](10/?lan=ch)
* [noise函数](11/?lan=ch)
* [Random 函数](10/?lan=ch)
* [noise 函数](11/?lan=ch)
* 布朗运动
* 分形
* 图像处理:
* 纹理
* 图像操作
* 内核卷积
* 过滤器
* 图像处理
* 卷积
* 滤镜
* 其他效果
* 模拟
* 乒乓
* Conway生命游戏
* 涟漪
* 水波
* 水彩
* 反应扩散
@ -55,16 +55,16 @@
* 灯光
* 法线贴图
* 凹凸贴图
* 光线跟踪
* 光线跟踪Ray marching
* 环境贴图 (spherical and cube)
* 折射和反射
* [附录:](appendix/) Other ways to use this book
* [附录:](appendix/) 其他阅读本书的方式
* [如何离线阅读此书?](appendix/?lan=ch)
* [如何在RaspberryPi上运行示例?](appendix/?lan=ch)
* [如何在树莓派上运行示例程序?](appendix/?lan=ch)
* [如何打印这本书](appendix/?lan=ch)
* [示例墙](examples/?lan=ch)
* [example gallery](examples/?lan=ch)
* [词汇表](glossary/?lan=ch)
@ -79,8 +79,11 @@ Patricio 研习和实践精神疗法psychotherapy和表达性艺术治疗
## 关于译者
* [Artrustee](https://github.com/Artrustee)
* [tornote](http://tornote.com/)
* [tornote](http://tornote.com/) 翻译 00-05 及第 11 章。
* [Artrustee](https://github.com/Artrustee) 翻译 06-10 章。
后续章节作者仍在撰写中,如果感兴趣可以在 github 上查看部分后续章节代码。
## 致谢
@ -88,11 +91,17 @@ Patricio 研习和实践精神疗法psychotherapy和表达性艺术治疗
感谢 [Scott Murray](http://alignedleft.com/) 给予的启发和建议。
感谢 [Kenichi Yoneda (Kynd)](https://twitter.com/kyndinfo) 的 [日语翻译 (日本語訳)](?lan=jp)
感谢 [Kenichi Yoneda (Kynd)](https://twitter.com/kyndinfo) 和 [Sawako](https://twitter.com/sawakohome) 的 [日文版翻译(日本語訳)](?lan=jp)
感谢 [Tong Li](https://www.facebook.com/tong.lee.9484) 和 [Yi Zhang](https://www.facebook.com/archer.zetta?pnref=story) 的 [中文版(Chinese)](?lan=ch) 翻译。
感谢 [Jae Hyun Yoo](https://www.facebook.com/fkkcloud) 的 [韩文版 (한국어)](?lan=kr) 翻译。
感谢 [Nahuel Coppero (Necsoft)](http://hinecsoft.com/) 的 [西班牙语(español)](?lan=es) 翻译。
感谢 [Karim Naaji](http://karim.naaji.fr/) 在代码和想法上的支持和贡献。
感谢所有相信这个项目志友们[contributed with fixes](https://github.com/patriciogonzalezvivo/thebookofshaders/graphs/contributors) 以及大家的捐赠.
感谢所有相信这个项目的人[contributed with fixes](https://github.com/patriciogonzalezvivo/thebookofshaders/graphs/contributors) 以及大家的捐赠.
## 获取新的章节

Loading…
Cancel
Save