《Unity着色器和屏幕特效》——导读

前  言

Unity提供了一系列工具来帮助开发者创建和运行游戏项目。Unity 5用全新的标准着色器替换了大部分旧版着色器,为我们带来了功能上的重大升级。新着色器通过简单设置便可模拟真实物体表面上的很多物理特性。

本书将探索这一系列新着色器为我们带来的全新选择,以及学习它们如何与光照和特效相互作用,产生高质量的游戏画面。

为了实现当今游戏画面中的真实感,人们走过了一条漫长的道路。在过去相当长的时间里,实时光照所带来的额外运算量为游戏研发制造了很多困扰。有时候,实现真实感的重担直接落在了纹理美术设计师的肩上。他们不得不将许多静态的表面效果直接烘焙到游戏角色和材质的纹理当中。

这种静态烘焙的方法有时在一些动态的游戏角色身上难以达到理想效果——特别是当一个角色移动到较阴暗或者较明亮的空间中时,静态烘焙难以实现良好的亮度等级变化,使得游戏画面显得粗糙而不真实。

计算机图形理论的进化,特别是显卡设备的升级换代,使很多基于实时光照的技术能够更加高效地运作。同时这也使人们对现代游戏报以更高的期望——我们希望在充满动态光照的场景中看到更逼真的物体表面。

在本书中,读者将通过一个典型的科幻题材恐怖游戏来学习这些新的着色器和光照理论。基于此,我们将能够探索各式各样的光照和物体表面效果。

本书主要内容

在本书的不同章节中,我们将学习Unity 5中的所有主要着色器和效果。在每一章中我们会研究一个不同的场景文件。

第1章介绍基本概念,并通过为恐怖科幻游戏中的场景设置材质属性,展示Unity标准着色器的能力和局限性。

第2章继续设计飞船维修场景——通过创建自定义着色器优化游戏场景的外观。我们将从无到有创建自定义着色器,然后基于它,为头盔的透明外观和星球的大气创建更加复杂的效果。

第3章深入学习场景光照和自发光表面的关系,并在飞船驾驶舱场景中为一个星球模型实现全息影像效果。

第4章研究通过不同的技术在着色器中实现动画。在展示更复杂的基于自定义着色器的顶点动画之前,我们将演示如何通过滚动UV坐标和在C#中遍历纹理数组的方法来显示动画的全息影像。

第5章介绍在星球表面上所应用的各种透明效果,并且为多种材质指定现有的以及特殊创建的着色器。

第6章重点展示在Unity 5的标准着色器中,高光工作流和金属工作流的不同之处。

第7章展示在一个室内场景中为角色创建统一的皮肤和毛发着色器。本章中的第一个着色器为一些特殊的半透明材质(例如,宇航员的皮肤)实现次表面散射效果。紧接着我们将继续创建使用“基于物理渲染”方法的毛发和眼睛着色器。

第8章讲述如何创建实现烟雾、蒸汽和火焰的着色器。与前面章节类似,我们将不会满足于Unity的默认着色器,而是要为恐怖科幻游戏创建更高级别的电影效果。本章的场景将是飞船的走廊。

第9章研究如何在安卓和iOS等移动设备平台上测试自定义着色器。
阅读准备

完成本书中的各个章节需要读者具备基本的3D图形概念。此外还需要:
在计算机中安装Unity 5(macOS或者Windows均可)。免费个人版即可满足本书所有章节中的实例程序。该版本可以从Unity官方网站下载。

虽然书中所含代码均会被清晰地讲解,但是具备Unity脚本和C#基础知识会对理解本书内容有益。

读者人群

本书面向具有一定Unity和C#基础知识并希望为下一代游戏开发着色器和效果的中等水平的游戏开发者。我们假设读者对游戏开发和游戏美术设计的基础背景知识有一定了解。

本书约定

在本书中,不同类型的内容使用多种不同的字体风格。这里列举一些示例并阐述它们的含义。

目  录

[第1章 掌握标准着色器
1.1 创建程序项目 ](/)
1.2 导入项目文件
1.3 加载飞船维修场景并在场景中漫游
1.3.1 为宇航员创建材质
1.3.2 为宇航员的装备创建材质
1.3.3 为飞船创建材质
1.3.4 为星球创建材质
1.3.5 设置天空盒
1.3.6 调节场景光照并添加效果
1.4 总结
[第2章 创建自定义着色器
2.1 打开程序项目 ](/)
2.1.1 打开场景
2.1.2 创建第一个自定义着色器
2.2 进阶的透明效果
2.2.1 创建自定义透明着色器
2.2.2 编辑透明着色器
2.3 进阶的星球大气效果
2.3.1 创建自定义大气着色器
2.3.2 应用大气着色器
2.3.3 编辑大气着色器
2.4 总结

时间: 2024-10-28 08:03:46

《Unity着色器和屏幕特效》——导读的相关文章

《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

1.2 当函数式编程遇见面向对象 深入理解Scala 函数式编程和面向对象编程是软件开发的两种不同途径.函数式编程并非什么新概念,在现代开发者的开发工具箱里也绝非是什么天外来客.我们将通过Java生态圈里的例子来展示这一点,主要来看Spring Application framework和Google Collections库.这两个库都在Java的面向对象基础上融合了函数式的概念,而如果我们把它们翻译成Scala,则会优雅得多.在深入之前,我们需要先理解面向对象编程和函数式编程这两个术语的含义

《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

1.4 与JVM的无缝集成 深入理解Scala Scala的吸引力之一在于它与Java和JVM的无缝集成.Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类.这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的.在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里. 1.4.1 Scala调用Java 从S

《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)

第2章 核心规则深入理解Scala 本章包括的内容: • 使用Scala交互模式(Read Eval Print Loop 简称REPL) • 面向表达式编程 • 不变性(Immutability) • Option类 本章内容覆盖了每个新Scala开发者都需要知道的几个主题.本章不会深入到每个主题里,但是会讲到可以让你自己去接着探索的程度.你将学会使用REPL,学会如何利用这个工具做软件的快速原型开发.然后我们会学到面向表达式编程,并从另一个视角来看控制结构是怎么回事.在此基础上,我们来研究不

《深入理解Scala》——第1章,第1.3节静态类型和表达力

1.3 静态类型和表达力 深入理解Scala 开发人员中有一个误解,认为静态类型必然导致冗长的代码.之所以如此是因为很多继承自C的语言强制要求程序员必须在代码中多处明确地指定类型.随着软件开发技术和编译器理论的发展,情况已经改变.Scala利用了其中一些技术进步来减少样板(boilerplate)代码,保持代码简洁. Scala做了以下几个简单的设计决策,以提高代码表达力. • 把类型标注(type annotation)换到变量右边. • 类型推断. • 可扩展的语法. • 用户自定义的隐式转

《深入理解Scala》——第1章,第1.5节总结

1.5 总结 深入理解Scala 本章中,你学到了一些Scala的设计理念.设计Scala的初衷在于把不同语言中的多种概念融合起来.Scala融合了函数式和面向对象编程,尽管显然Java也已经这么做了.Scala精选其语法,极大地减少了语言中的繁冗之处,使一些强大的特性可以优雅地表达,比如类型推断.最后,Scala和Java能够紧密集成,而且运行在Java虚拟机上,这或许是让Scala变成一种实用选择的最重要的一点.几乎不花代价就可以把Scala用于我们的日常工作中. 因为Scala融合了多种概

《深入理解Scala》——第1章,第1.1节Scala一种混合式编程语言

第1章 Scala--一种混合式编程语言 Scala是一种将其他编程语言中的多种技巧融合为一的语言.Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程.函数式编程.富有表达力的语法.静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上.因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐.Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式.

《深入理解Scala》——第2章,第2.2节优先采用面向表达式编程

2.2 优先采用面向表达式编程 深入理解Scala 面向表达式编程是个术语,意思是在代码中使用表达式而不用语句.表达式和语句的区别是什么?语句是可以执行的东西,表达式是可以求值的东西.在实践中这有什么意义呢?表达式返回值,语句执行代码,但是不返回值.本节我们将学习面向表达式编程的全部知识,并理解它对简化程序有什么帮助.我们也会看一下对象的可变性,以及可变性与面向表达式编程的关系. 作者注:语句VS表达式 语句是可以执行的东西,表达式是可以求值的东西. 表达式是运算结果为一个值的代码块.Scala

《深入理解Scala》——第2章,第2.3节优先选择不变性

2.3 优先选择不变性 深入理解Scala 编程中的不变性指对象一旦创建后就不再改变状态.这是函数式编程的基石之一,也是JVM上的面向对象编程的推荐实践之一.Scala也不例外,在设计上优先选择不变性,在很多场景中把不变性作为默认设置.对此,你可能一下子会不适应.本节中,我们将学到不变性对于判等问题和并发编程能提供什么帮助. Scala里首先要明白的是不变对象和不变引用(immutable referene)的区别.Scala里的所有变量都是指向对象的引用.把变量声明为val意味着它是个不变"引

《深入理解Scala》——第2章,第2.4节用None不用null

2.4 用None不用null深入理解Scala Scala在标准库里提供了scala.Option类,鼓励大家在一般编程时尽量不要使用null.Option可以视作一个容器,里面要么有东西,要么什么都没有.Option通过两个子类来实现此含义:Some和None.Some表示容器里有且仅有一个东西,None表示空容器,有点类似List的Nil的含义. 在Java和其他允许null的语言里,null经常作为一个占位符用于返回值,表示非致命的错误,或者表示一个变量未被初始化.Scala里,你可以用

《深入理解Scala》——第2章,第2.5节多态场景下的判等

2.5 多态场景下的判等 深入理解Scala 众所周知,为多态的面向对象系统定义合适的判等和散列方法是个特别难的过程.这是因为子类可能在整个过程中造成一些相当怪异的问题,尤其是当类型层次上有多个实体(concrete)级别的时候.一般来说,对于需要比引用判等更强的判等(译者注:比如需要判断对象内部数据)的类,最好避免多层实体类层次.这是什么意思呢?有些时候类只需要引用判等就够了.也就是说只要两个对象不是同一个实例就判为不等.但是如果我们需要判断两个不同实例是否相等,而且又有多层实体类层次(mul