Skip to content

Commit

Permalink
针对移动设备修改着色器
Browse files Browse the repository at this point in the history
  • Loading branch information
linkliu committed Mar 26, 2023
1 parent 6b1998b commit 871e0e1
Show file tree
Hide file tree
Showing 11 changed files with 132 additions and 34 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1052,7 +1052,7 @@ _看起来很简陋, 但是着色器开发环境搭建好了,接下来我们


### 如何把Unity 4的旧着色器迁移至Unity 5
不可否认,在过去10年中图形学在电子游戏中获得了惊人的发展。每一个新游戏带来的尖端技术让我们的游戏画面更加接近现实。随着Unity引擎版本的不断迭代,它的着色器技术也自然而然的经历了相当大的变化。这也是为什第一次接触着色器的时候感到困惑的原因。在Unity5还没有推出之前,Unity自带了两种不同的着色器,分别是:**漫反射(Diffuse)**和**镜面反射(Specular)**。正如其名字所描述,它们分别用来模拟表面粗糙和表面光滑的材料。如果你现在使用的Unity5,那么你其实可以跳过这个知识点。该知识点会讲解如何在Unity5中重现这些效果。
不可否认,在过去10年中图形学在电子游戏中获得了惊人的发展。每一个新游戏带来的尖端技术让我们的游戏画面更加接近现实。随着Unity引擎版本的不断迭代,它的着色器技术也自然而然的经历了相当大的变化。这也是为什第一次接触着色器的时候感到困惑的原因。在Unity5还没有推出之前,Unity自带了两种不同的着色器,分别是:**漫反射(Diffuse)**和**高光反射(Specular)**。正如其名字所描述,它们分别用来模拟表面粗糙和表面光滑的材料。如果你现在使用的Unity5,那么你其实可以跳过这个知识点。该知识点会讲解如何在Unity5中重现这些效果。


***
Expand All @@ -1075,7 +1075,7 @@ _看起来很简陋, 但是着色器开发环境搭建好了,接下来我们

**注意**

尽管Unity4版本的漫反射,镜面反射和其他内建的着色器现在已经已弃用了,但是Unity5依然向后对它们保持兼容。它们在材质的**Legacy Shaders**路径下的下拉列表中依然可以看到。
尽管Unity4版本的漫反射,高光反射和其他内建的着色器现在已经已弃用了,但是Unity5依然向后对它们保持兼容。它们在材质的**Legacy Shaders**路径下的下拉列表中依然可以看到。

- **使用标准着色器**

Expand Down Expand Up @@ -1570,27 +1570,27 @@ _看起来很简陋, 但是着色器开发环境搭建好了,接下来我们

- **fixed Alpha**: 这是材质的透明度

- **half Specular**: 这是镜面反射度【就是看起来多像镜面?】,值的变化是从0到1
- **half Specular**: 这是高光反射度【就是看起来多像高光?】,值的变化是从0到1

- **fixed Gloss**: 这是镜面强度
- **fixed Gloss**: 这是高光强度

**标准表面输出SurfaceOutputStandard**结构体包含以下的属性:
- **fixed3 Albedo**: 这是材质的基本颜色(不管是镜面反射还是漫反射)
- **fixed3 Albedo**: 这是材质的基本颜色(不管是高光反射还是漫反射)
- **fixed3 Normal**:空间中法线的切线,如果有法线的话
- **half3 Emission**: 跟表面输出结构体一样的意思,不过在这里定义为**half3**类型,而在表面输出结构体中定义为**fixed3**类型。
- **fixed Alpha**:同表面输出结构体
- **half Occlusion**: 这个是遮挡(默认是1)
- **half Smoothness**: 这个是光滑度 (0 = 粗糙, 1 = 光滑)
- **half Metallic**:金属质感 0 = 无金属质感, 1= 金属

**标准镜面表面输出SurfaceOutputStandardSpecular**结构拥有如下属性:
**标准高光表面输出SurfaceOutputStandardSpecular**结构拥有如下属性:
- **fixed3 Albedo**:同上
- **fixed3 Normal**:同上
- **half3 Emission**:同上
- **fixed Alpha**:同上
- **half Occlusion**:同上
- **half Smoothness**:同上
- **fixed3 Specular**: 这个是镜面反射的颜色,这个跟表面叔叔结构体中的镜面反射有很大的不同,因为这里是用颜色表示,而在表面输出结构体中只是一个简单的值
- **fixed3 Specular**: 这个是高光反射的颜色,这个跟表面叔叔结构体中的高光反射有很大的不同,因为这里是用颜色表示,而在表面输出结构体中只是一个简单的值


正确的给表面输出结构体赋值,初始化,是使用表面着色器的前提。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ tags: [U3D, Shader,Cookbook,中文版]
---

### 如何把Unity 4的旧着色器迁移至Unity 5
不可否认,在过去10年中图形学在电子游戏中获得了惊人的发展。每一个新游戏带来的尖端技术让我们的游戏画面更加接近现实。随着Unity引擎版本的不断迭代,它的着色器技术也自然而然的经历了相当大的变化。这也是为什第一次接触着色器的时候感到困惑的原因。在Unity5还没有推出之前,Unity自带了两种不同的着色器,分别是:**漫反射(Diffuse)**和**镜面反射(Specular)**。正如其名字所描述,它们分别用来模拟表面粗糙和表面光滑的材料。如果你现在使用的Unity5,那么你其实可以跳过这个知识点。该知识点会讲解如何在Unity5中重现这些效果。
不可否认,在过去10年中图形学在电子游戏中获得了惊人的发展。每一个新游戏带来的尖端技术让我们的游戏画面更加接近现实。随着Unity引擎版本的不断迭代,它的着色器技术也自然而然的经历了相当大的变化。这也是为什第一次接触着色器的时候感到困惑的原因。在Unity5还没有推出之前,Unity自带了两种不同的着色器,分别是:**漫反射(Diffuse)**和**高光反射(Specular)**。正如其名字所描述,它们分别用来模拟表面粗糙和表面光滑的材料。如果你现在使用的Unity5,那么你其实可以跳过这个知识点。该知识点会讲解如何在Unity5中重现这些效果。

***

Expand All @@ -27,7 +27,7 @@ tags: [U3D, Shader,Cookbook,中文版]

**注意**

尽管Unity4版本的漫反射,镜面反射和其他内建的着色器现在已经已弃用了,但是Unity5依然向后对它们保持兼容。它们在材质的**Legacy Shaders**路径下的下拉列表中依然可以看到。
尽管Unity4版本的漫反射,高光反射和其他内建的着色器现在已经已弃用了,但是Unity5依然向后对它们保持兼容。它们在材质的**Legacy Shaders**路径下的下拉列表中依然可以看到。

- **使用标准着色器**

Expand Down
10 changes: 5 additions & 5 deletions _posts/shader_book/2020-10-24-表面着色器和纹理贴图.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,27 +139,27 @@ tags: [U3D, Shader,Cookbook,中文版]

- **fixed Alpha**: 这是材质的透明度

- **half Specular**: 这是镜面反射度【就是看起来多像镜面?】,值的变化是从0到1
- **half Specular**: 这是高光反射度【就是看起来多像高光?】,值的变化是从0到1

- **fixed Gloss**: 这是镜面强度
- **fixed Gloss**: 这是高光强度

**标准表面输出SurfaceOutputStandard**结构体包含以下的属性:
- **fixed3 Albedo**: 这是材质的基本颜色(不管是镜面反射还是漫反射)
- **fixed3 Albedo**: 这是材质的基本颜色(不管是高光反射还是漫反射)
- **fixed3 Normal**:空间中法线的切线,如果有法线的话
- **half3 Emission**: 跟表面输出结构体一样的意思,不过在这里定义为**half3**类型,而在表面输出结构体中定义为**fixed3**类型。
- **fixed Alpha**:同表面输出结构体
- **half Occlusion**: 这个是遮挡(默认是1)
- **half Smoothness**: 这个是光滑度 (0 = 粗糙, 1 = 光滑)
- **half Metallic**:金属质感 0 = 无金属质感, 1= 金属

**标准镜面表面输出SurfaceOutputStandardSpecular**结构拥有如下属性:
**标准高光表面输出SurfaceOutputStandardSpecular**结构拥有如下属性:
- **fixed3 Albedo**:同上
- **fixed3 Normal**:同上
- **half3 Emission**:同上
- **fixed Alpha**:同上
- **half Occlusion**:同上
- **half Smoothness**:同上
- **fixed3 Specular**: 这个是镜面反射的颜色,这个跟表面叔叔结构体中的镜面反射有很大的不同,因为这里是用颜色表示,而在表面输出结构体中只是一个简单的值
- **fixed3 Specular**: 这个是高光反射的颜色,这个跟表面叔叔结构体中的高光反射有很大的不同,因为这里是用颜色表示,而在表面输出结构体中只是一个简单的值


正确的给表面输出结构体赋值,初始化,是使用表面着色器的前提。
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ tags: [U3D, Shader,Cookbook,中文版]

- **介绍**

我们在**[第三章](https://linkliu.github.io/game-tech-post/posts/%E7%90%86%E8%A7%A3%E5%85%89%E7%85%A7%E6%A8%A1%E5%9E%8B/)**,**理解光照模型** 中介绍了所有的光照模型,简单的讨论了一下光是如何表现的。在编写它们的时候**效率efficiency**是最重要的方面。实时渲染的开销是很大的,类似于**Lambertian**和**BlinnPhong**这样的光照模型技术,也仅仅是在模拟现实和性能开销中的折中方案。拥有了更加强劲的**GPU(graphics processing unit)**后,我们就可以编写更加精细的光照模型和渲染引擎,目的就是为了模拟光的真实行为。简单概括前面的来说,这就是PBR后面的哲学。正如它的名字所表达的那样, 它是尽可能的去接近真实的物理,来处理每一个不同材质,让他们看起来都不一样。不仅如此,PBR这个术语被广泛的用于市场营销,它更像是**艺术级的渲染(state-of-the-art rendering)**,而不是一个简单的技术。Unity5通过引入两个重要的改变,实现了PBR。首先是一个全新的光照模型(叫**Standard**)。表面着色器允许开发人员指定材质的物理属性,但是他们却没有对它们应用任何的物理原理限制。PBR用新的光照模型来弥补了这个差距,应用了一些物理原理,比如**能量守恒(energy conservation)**[一个物体反射的光线不可能多于接收的光线],**微表面散射(microsurface scattering)** [粗糙表面比光滑表面的反射更没有规律],**菲涅尔反射(Fresnel reflectance)**[镜面反射出现在掠射角内],和**表面阻塞(surface occlusion)**[一些角落的暗部和一些几何体很难照亮]。所有说的这方面,还有一些其他的,都被用来计算标准光照模型。第二方面让PBR开起来如此真实技术叫**全局光照(Global Illumination [GI])**,它是对基于物理原理的光线传输的模拟。也就是说,如果这些物体是独立的实体,那么它们不会被绘制[不会反光只吸收光的的物体,这种绝对黑体是看不见的]。它们会影响最终的渲染效果,因为光线在碰到其他物体前首先会从它们身上反射。虽然在着色器中不会自动提及这方面,但是对于了解渲染引擎是如何工作来说是很重要的部分。然而令人难过的是,实时的精确模拟光线在物体表面到底是如何反弹,这已经超出了现代GPU的能力范围。Unity5做了一些很聪明的优化,即保持了视觉质量有没有牺牲性能。然而大部分的一些进阶技术(比如反射) 需要用户的输入。上面说的这些方面都会在本章介绍。 不过希望各位留意的是,即使是PBR或者GI这些技术也不能保证你的游戏可以获得照片级的画质。要获得照片级的画面是一项很有挑战性的工作,跟每一门艺术一样,需要非常专业和杰出的技巧。
我们在**[第三章](https://linkliu.github.io/game-tech-post/posts/%E7%90%86%E8%A7%A3%E5%85%89%E7%85%A7%E6%A8%A1%E5%9E%8B/)**,**理解光照模型** 中介绍了所有的光照模型,简单的讨论了一下光是如何表现的。在编写它们的时候**效率efficiency**是最重要的方面。实时渲染的开销是很大的,类似于**Lambertian**和**BlinnPhong**这样的光照模型技术,也仅仅是在模拟现实和性能开销中的折中方案。拥有了更加强劲的**GPU(graphics processing unit)**后,我们就可以编写更加精细的光照模型和渲染引擎,目的就是为了模拟光的真实行为。简单概括前面的来说,这就是PBR后面的哲学。正如它的名字所表达的那样, 它是尽可能的去接近真实的物理,来处理每一个不同材质,让他们看起来都不一样。不仅如此,PBR这个术语被广泛的用于市场营销,它更像是**艺术级的渲染(state-of-the-art rendering)**,而不是一个简单的技术。Unity5通过引入两个重要的改变,实现了PBR。首先是一个全新的光照模型(叫**Standard**)。表面着色器允许开发人员指定材质的物理属性,但是他们却没有对它们应用任何的物理原理限制。PBR用新的光照模型来弥补了这个差距,应用了一些物理原理,比如**能量守恒(energy conservation)**[一个物体反射的光线不可能多于接收的光线],**微表面散射(microsurface scattering)** [粗糙表面比光滑表面的反射更没有规律],**菲涅尔反射(Fresnel reflectance)**[高光反射出现在掠射角内],和**表面阻塞(surface occlusion)**[一些角落的暗部和一些几何体很难照亮]。所有说的这方面,还有一些其他的,都被用来计算标准光照模型。第二方面让PBR开起来如此真实技术叫**全局光照(Global Illumination [GI])**,它是对基于物理原理的光线传输的模拟。也就是说,如果这些物体是独立的实体,那么它们不会被绘制[不会反光只吸收光的的物体,这种绝对黑体是看不见的]。它们会影响最终的渲染效果,因为光线在碰到其他物体前首先会从它们身上反射。虽然在着色器中不会自动提及这方面,但是对于了解渲染引擎是如何工作来说是很重要的部分。然而令人难过的是,实时的精确模拟光线在物体表面到底是如何反弹,这已经超出了现代GPU的能力范围。Unity5做了一些很聪明的优化,即保持了视觉质量有没有牺牲性能。然而大部分的一些进阶技术(比如反射) 需要用户的输入。上面说的这些方面都会在本章介绍。 不过希望各位留意的是,即使是PBR或者GI这些技术也不能保证你的游戏可以获得照片级的画质。要获得照片级的画面是一项很有挑战性的工作,跟每一门艺术一样,需要非常专业和杰出的技巧。


***
Expand All @@ -33,7 +33,7 @@ tags: [U3D, Shader,Cookbook,中文版]

## 理解金属质感的设置

Unity5提供了两种不同类型的PBR着色器; 它们指的是材质的**检查器面板(Inspector)**中的下拉列表中的**Standard**着色器和**Standard (Specular setup)**着色器。两者的主要区别在于前者为我们暴露了**Metallic**这个属性,而后者没有**Metallic**,但暴露了**Specular**这个属性。metallic 属性和specular 属性代表了初始化PBR材质不同方式。推动PBR的概念之一是提供给开发人员和艺术家一种有目的性的,基于物理相关的一些属性,让他们可以调整和把玩它们。 有些材质的属性更容易用来表示它们的质金属质感强度指标,而其他的另一些属性则直接于定义了光是如何反射的,也很重要。如果你过去使用过Unity4,那么对于**Standard (Specular setup)**着色器应该看起来更熟悉。这个知识点会教你如何有效的使用**金属质感设置(metallic setup)**。有个重点需要各位注意,金属质感的工作流不仅仅用于金属材质;它是根据表面的金属质感或者非金属质感来定义材质的视觉效果的一种方式。尽管呈现的是两种不同的类型的着色器,但这**金属(Metallic )**和**镜面(Specular)**这两种方案通常来说是相等的表示。 就像Unity文档中所展示的:[http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html](http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html),这两种设置都可以创建同样的材质(如下图所示):
Unity5提供了两种不同类型的PBR着色器; 它们指的是材质的**检查器面板(Inspector)**中的下拉列表中的**Standard**着色器和**Standard (Specular setup)**着色器。两者的主要区别在于前者为我们暴露了**Metallic**这个属性,而后者没有**Metallic**,但暴露了**Specular**这个属性。metallic 属性和specular 属性代表了初始化PBR材质不同方式。推动PBR的概念之一是提供给开发人员和艺术家一种有目的性的,基于物理相关的一些属性,让他们可以调整和把玩它们。 有些材质的属性更容易用来表示它们的质金属质感强度指标,而其他的另一些属性则直接于定义了光是如何反射的,也很重要。如果你过去使用过Unity4,那么对于**Standard (Specular setup)**着色器应该看起来更熟悉。这个知识点会教你如何有效的使用**金属质感设置(metallic setup)**。有个重点需要各位注意,金属质感的工作流不仅仅用于金属材质;它是根据表面的金属质感或者非金属质感来定义材质的视觉效果的一种方式。尽管呈现的是两种不同的类型的着色器,但这**金属(Metallic )**和**高光(Specular)**这两种方案通常来说是相等的表示。 就像Unity文档中所展示的:[http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html](http://docs.unity3d.com/Manual/StandardShaderMetallicVsSpecular.html),这两种设置都可以创建同样的材质(如下图所示):
<div align="center"><img src="https://linkliu.github.io/game-tech-post/assets/img/shader_book/diagram47.png"/></div>

***
Expand Down Expand Up @@ -74,7 +74,7 @@ Unity5提供了两种不同类型的PBR着色器; 它们指的是材质的**

金属是电的良导体;而光是电磁波的一种形式,也就是说相比于不良导体(经常被称为**绝缘体(insulators)**),几乎所的金属都有相似的行为表现。导体的反射率很高,能反射大部分的光子(70-100%)。然后剩余没有被反射的光就被吸收了,不是漫反射出来,也就是说导体的漫反射元素很黑[其实我觉得翻译成很低也能说的通]。相反的是,绝缘体反射率很低(%4)而剩余的光在表面被散射掉了,所以漫反射效果明显。

在标准着色器中,纯金属材质拥有较黑的漫反射元素并且它的镜面反射的颜色由**Albedo**贴图来定义。相反的,对于纯粹的非金属材料来说,**Albedo**贴图定义的是它们的漫反射元素; 而它们的镜面高光颜色其实是由射进来的光颜色决定的遵守这些规则在金属工作流中可以把**albedo**和**specular**结合进**Albedo**贴图中去,实行精确的物理行为。在牺牲材质视觉效果控制的前提下,这能让我们节省更多的空间,而且极大的提升运行速度。
在标准着色器中,纯金属材质拥有较黑的漫反射元素并且它的高光反射的颜色由**Albedo**贴图来定义。相反的,对于纯粹的非金属材料来说,**Albedo**贴图定义的是它们的漫反射元素; 而它们的高光高光颜色其实是由射进来的光颜色决定的遵守这些规则在金属工作流中可以把**albedo**和**specular**结合进**Albedo**贴图中去,实行精确的物理行为。在牺牲材质视觉效果控制的前提下,这能让我们节省更多的空间,而且极大的提升运行速度。

***

Expand Down
Loading

0 comments on commit 871e0e1

Please sign in to comment.