【Unity Shader入门精要】— Unity中的基础光照

内容会持续更新,有错误的地方欢迎指正,谢谢!

引言

计算机图形学的第一定律:如果它看起来是对的,那么它就是对的。

标准光照模型

应用最普遍的光照模型。它把进入到摄像机的光线分成4部分,每部分使用一种方法计算它的贡献度:
a、自发光(emissive):大多数物体都不用添加自发光。
b、高光反射(specular):当光线照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
c、漫反射(diffuse):当光线照射到表面时,该表面会向每个方向散射多少辐射量。
d、环境光(ambient):其他所有间接光照。

逐像素光照和逐顶点光照:
在顶点着色器中计算公式,叫逐顶点光照;也可以在片元着色器中计算,叫逐像素光照。逐像素光照中,我们以每个像素为基础,得到它的法线(可以是顶点法线插值得到的,也可以是法线纹理采样得到的),然后进行光照计算。
逐顶点光照也被称为高洛德着色(Gouraud shading),逐顶点光照中,我们在每个顶点上计算光照,然后会在渲染图元时进行线性插值,最后输出成像素颜色。
由于顶点数目往往远小于像素数目,因此逐顶点光照的计算量往往小于逐像素光照。但逐顶点光照是线性插值出来的,当光照模型中有非线性计算(例如计算高光反射)时,逐顶点光照会出问题。而且对顶点颜色的差值也会使图元内部的颜色总是暗于顶点处的颜色,会有可能产生明显的棱角现象。

补充一点:移动平台在光照处理上的各种限制,我们要尽量避免实时光影,实用中有各种技术,比如烘焙,光照贴图,或者各种用纹理效果实现光照的效果,如果非要用,要用尽量简单的光照模型,逐顶点光照等。

漫反射的实现

漫反射光照模型,又叫兰伯特光照模型。

实践1:逐顶点光照(效果不好)
结果:在背光面与向光面交界处有一些锯齿。
这里写图片描述

实践2:逐像素光照(效果一般)
结果:可以得到更加平滑的光照效果,但还是有个问题:光照无法达到的区域,模型外观通常是全黑的。
这里写图片描述

实践3:使用半兰伯特模型(效果完美)
结果:完美!
这里写图片描述
依次为:逐顶点漫反射光照、逐像素漫反射光照、半兰伯特光照的对比效果

高光反射的实现

高光反射光照模型,又叫Phong光照模型。

实践1:逐顶点光照(效果不好)
结果:高光部分明显不平滑。
原因:高光反射部分的计算是非线性的,而在顶点着色器中计算光照再进行插值的过程是线性的,破坏了原计算的非线性的关系。
这里写图片描述

实践2:逐像素光照(效果一般)
结果:可以得到更加平滑的高光效果。
这里写图片描述

实践3:使用Blinn-Phong光照模型(效果完美)
结果:完美!Blinn-Phong光照模型的高光反射部分看起来更大、更亮一些,在实际渲染中,绝大多数情况都会选择Blinn-Phong光照模型。
这里写图片描述
依次为:逐顶点的高光反射光照、逐像素的高光反射光照(Phong光照模型)和Blinn-Phong高光反射光照的对比效果

使用Unity内置的函数

我们经常需要光源方向,视角方向等信息。而手动计算这些信息很麻烦。Unity为我们提供了内置函数。
这里写图片描述
有了它们我们就方便多了,今后我们会用它们代替计算,有一点需要注意,它们不保证归一化,所以我们要手动归一化。

Unity Shader是一种用于渲染图形的程序,它可以控制对象的表面颜色、纹理、透明度、反射等属性,从而实现特殊的视觉效果。对于游戏开发者来说,掌握Shader编写技巧是非常重要的。 以下是关于Unity Shader入门精要: 1. ShaderLab语言 ShaderLab是Unity用于编写Shader的语言,它是一种基于标记的语言,类似于HTML。ShaderLab可以用于定义Shader的属性、子着色器、渲染状态等信息。 2. CG语言 CG语言是Unity用于编写Shader的主要语言,它是一种类似于C语言的语言,可以进行数学运算、向量计算、流程控制等操作。CG语言可以在ShaderLab嵌入,用于实现Shader的具体逻辑。 3. Unity的渲染管线 Unity的渲染管线包括顶点着色器、片元着色器、几何着色器等组件,每个组件都有不同的作用。顶点着色器用于对对象的顶点进行变换,片元着色器用于计算每个像素的颜色,几何着色器用于处理几何图形的变形和细节等。 4. 模板和纹理 在Shader,我们可以使用纹理来给对象添加图案或者贴图,也可以使用模板来控制对象的透明度、反射等属性。纹理可以通过内置函数tex2D()来获取,模板可以通过内置函数clip()来实现裁剪。 5. Shader的实现 Shader的实现需要注意以下几点: - 在ShaderLab定义Shader的属性、子着色器、渲染状态等信息。 - 在CG语言实现Shader的具体逻辑,包括顶点着色器、片元着色器等内容。 - 使用纹理和模板来实现特定的视觉效果。 - 在对象上应用Shader,通过调整Shader的属性来达到不同的效果。 以上是关于Unity Shader入门精要,希望对你有所帮助。如果你想更深入地了解Shader的编写技巧,可以参考官方文档或者相关教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值