|
4 | 4 |
|
5 | 5 | 程序员的三大浪漫:编译原理、操作系统和图形学 |
6 | 6 |
|
| 7 | +第3章Unity Shader基础 Unity在原有的渲染流程上进行了封装,并提供给开发者新的图像编程接口——Unity Shader。这一章将讲解Unity Shader的实现原理和基本语法,同时也将为读者解答一些常见的困惑点。第4章 学习Shader所需的数学基础 数学向来是初学者面对的一大学习障碍。然而,在初级阶段的渲染学习中,我们需要掌握的数学理论实际并不复杂。本章将为读者讲解渲染过程中常见的数学知识,如矢量、矩阵运算、坐标空间等。本章内容可以大大帮助读者理解Shader中的数学运算。为了帮助读者加深理解,我们在讲解过程中以一个具体的例子来阐述“一头奶牛的鼻子是如何一步步被绘制到屏幕上的”。 |
| 8 | + |
| 9 | + |
| 10 | + |
| 11 | +第5章 开始Unity Shader学习之旅 本章将实现一个简单的顶点/片元着色器,并详细解释其中每个步骤的原理,这需要读者对之前基础篇的内容有所理解。本章还会给出关于Unity Shader的一些常用的辅助技巧,例如如何调试、查看内置代码以及编写规范等。第6章Unity中的基础光照 本章将学习如何在Shader中实现基本的光照模型,如漫反射、高光反射等。我们首先解释如何从无到有实现一个光照模型,最后给出使用Unity提供的内置函数来实现的版本。第7章 基础纹理 纹理的使用给渲染的世界带来了更多的变化。这一章将会讲述如何在Unity Shader中使用法线纹理、遮罩纹理等基础纹理。第8章 透明效果 透明是游戏中常用的渲染效果。这一章首先介绍了渲染的实现原理,并给出了和Unity的渲染顺序相关的重要内容。在了解了这些内容的基础上,我们将学习如何实现透明度测试和透明度混合等透明效果。 |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | +第9章 更复杂的光照 我们在初级篇中实现的光照模型没有考虑一些重要的光照计算,如阴影和光照衰减。本章首先讲解Unity中的3种渲染路径和3种重要的光源类型,再解释如何在前向渲染路径中实现包含了光照衰减、阴影等效果的完整的光照计算。在本章最后,我们会给出基于之前学习内容实现的包含了完整光照计算的Unity Shader。第10章 高级纹理 这一章将会讲解如何在Unity Shader中使用立方体纹理、渲染纹理和程序纹理等高级纹理。第11章 让画面动起来 静态的画面往往是无趣的。这一章将帮助读者学习如何在Shader中使用时间变量来实现纹理动画、顶点动画等动态效果。 |
| 16 | + |
| 17 | + |
| 18 | + |
| 19 | +第12章 屏幕后处理效果 屏幕特效是游戏中常用的渲染手法之一。这一章将介绍如何在Unity中实现一个基本的屏幕后处理脚本系统,并给出一些基本的屏幕特效的实现原理,如高斯模糊、边缘检测等。第13章 使用深度和法线纹理 使用深度和法线纹理可以帮助我们实现很多屏幕特效。本章将介绍如何在Unity中获取这些特殊的纹理来实现屏幕特效。第14章 非真实感渲染 很多游戏使用了非真实感渲染的方法来渲染游戏画面。这一章将会给出常见的非真实感渲染的算法,如卡通渲染、素描风格的渲染等。本章的扩展阅读部分可以帮助读者找到更多其他类型的非真实感渲染的实现方法。第15章 使用噪声 很多时候噪声是我们的救星。本章给出了噪声在游戏渲染中的一些应用。第16章Unity中的渲染优化技术 优化往往是游戏渲染中的重点。这一章介绍了Unity中针对移动平台使用的常见的优化技巧。 |
| 20 | + |
| 21 | + |
| 22 | + |
| 23 | +第17章Unity的表面着色器探秘 Unity提出了一种新颖的Shader形式——表面着色器。本章将会介绍这些表面着色器是如何实现的,以及如何使用这些表面着色器来实现渲染。第18章 基于物理的渲染 Unity 5终于引入了基于物理的渲染,这给Unity引擎带来了更强的渲染能力。这一章将介绍基于物理渲染的理论基础,并解释Unity是如何实现基于物理的渲染的。我们还会在本章实现一个基本的场景来进一步阐述如何在Unity 5中利用基于物理的渲染。第19章Unity 5更新了什么相较于Unity 4.x, Unity 5在Shader方面有很多重要的更新。本章将给出Unity 5中一些重要的更新,以帮助读者解决在升级Unity 5时所面对的各种问题。第20章 还有更多内容吗 图形学的丰富多彩远远超乎我们的想象,我们相信一本书也远远无法满足一些读者强烈的求知欲。在最后一章中,我们将给出许多非常有价值的学习资料,以帮助读者进行更深入的学习。 |
| 24 | + |
7 | 25 | ## 第2章 渲染流水线 |
8 | 26 |
|
9 | | -### 2.1 综述 |
| 27 | +这一章讲解了现代GPU是如何实现整个渲染流水线的,这些内容对于理解Shader的工作原理有着非常重要的作用 |
| 28 | + |
| 29 | +<img src="./1.png" style="zoom:80%;" /> |
| 30 | + |
| 31 | +### CPU和GPU之间的通信 |
| 32 | + |
| 33 | +渲染流水线的起点是CPU,即应用阶段。应用阶段大致可分为下面3个阶段: |
| 34 | + |
| 35 | +* (1)把数据加载到显存中。 |
| 36 | + |
| 37 | +* (2)设置渲染状态。 |
| 38 | + |
| 39 | +* (3)调用Draw Call |
| 40 | + |
| 41 | +### GPU流水线 |
| 42 | + |
| 43 | +当GPU从CPU那里得到渲染命令后,就会进行一系列流水线操作,最终把图元渲染到屏幕上。GPU渲染的过程就是GPU流水线。对于概念阶段的后两个阶段,即几何阶段和光栅化阶段,开发者无法拥有绝对的控制权,其实现的载体是GPU。GPU通过实现流水线化,大大加快了渲染速度。虽然我们无法完全控制这两个阶段的实现细节,但GPU向开发者开放了很多控制权。 |
| 44 | + |
| 45 | +<img src="./0.png" style="zoom:80%;" /> |
| 46 | + |
| 47 | +### 一些容易困惑的地方 |
| 48 | + |
| 49 | +1. OpenGL/DirectX:OpenGL和DirectX就是这些图像应用编程接口,这些接口用于渲染二维或三维图形。 |
| 50 | + |
| 51 | + <img src="./2.png" style="zoom:80%;" /> |
| 52 | + |
| 53 | +2. HLSL、GLSL、CG:着色语言是专门用于编写着色器的,常见的着色语言有DirectX的HLSL(HighLevel Shading Language)、OpenGL的GLSL(OpenGL Shading Language)以及NVIDIA的CG(C for Graphic)。HLSL、GLSL、CG都是“高级(High-Level)”语言,但这种高级是相对于汇编语言来说的,而不是像C#相对于C的高级那样。 |
| 54 | + |
| 55 | +3. Draw Call:CPU调用图像编程接口,如OpenGL中的glDrawElements命令或者DirectX中的DrawIndexedPrimitive命令,以命令GPU进行渲染的操作。 |
10 | 56 |
|
11 | | -### 2.2 CPU和GPU之间的通信 |
| 57 | +4. 为什么Draw Call多了会影响帧率? |
12 | 58 |
|
13 | | -### 2.3 GPU流水线 |
| 59 | + 在每次调用Draw Call之前,CPU需要向GPU发送很多内容,包括数据、状态和命令等。在这一阶段,CPU需要完成很多工作,例如检查渲染状态等。而一旦CPU完成了这些准备工作,GPU就可以开始本次的渲染。GPU的渲染能力是很强的,渲染200个还是2000个三角网格通常没有什么区别,因此渲染速度往往快于CPU提交命令的速度。如果Draw Call的数量太多,CPU就会把大量时间花费在提交Draw Call上,造成CPU的过载。 |
14 | 60 |
|
15 | | -### 2.4 一些容易困惑的地方 |
| 61 | +5. 固定管线渲染:在较旧的GPU上实现的渲染流水线。这种流水线只给开发者提供一些配置操作,但开发者没有对流水线阶段的完全控制权。 |
16 | 62 |
|
17 | | -### 2.5 那么,你明白什么是Shader了吗 |
| 63 | +### Shader |
18 | 64 |
|
19 | | -### 2.6 扩展阅读 |
| 65 | +* GPU流水线上一些可高度编程的阶段,而由着色器编译出来的最终代码是会在GPU上运行的(对于固定管线的渲染来说,着色器有时等同于一些特定的渲染设置); |
| 66 | +* 有一些特定类型的着色器,如顶点着色器、片元着色器等; |
| 67 | +* 依靠着色器我们可以控制流水线中的渲染细节,例如用顶点着色器来进行顶点变换以及传递数据,用片元着色器来进行逐像素的渲染。 |
20 | 68 |
|
21 | 69 | ## 第3章 Unity Shader基础 |
22 | 70 |
|
|
0 commit comments