Skip to content

lhcmt/Unity-Shader

Repository files navigation

Unity-Shader 学习

教程在catlikecoding.com

2018/7/18

第6章 凹凸贴图

1.高度贴图

将高度数据存储在纹理中,使用它来计算每个片段的法向量,计算方式:使用有限差分法,或者中心差分法来计算,分别沿着片段的uv坐标的u方向和v方向计算两个切向量,再计算对应的法向量n1,n2 然后将两个法向量叉乘,得到综合的法向量.

2.法线贴图 不同于高度贴图需要计算法向量,法线贴图直接保存片段的法线信息,然后使用片段的uv坐标直接采样即可

2.1Unity 中使用DXT5nm格式存储纹理 主要是为了与DXT5纹理压缩配合使用,其中x向量存储在A通道,Y向量存储在G通道,Z向量根据归一化自己算

2.2切线空间 通常,法线可以保存在模型空间中,比如说一个人物模型,在美术创建这个资源的时候,就将模型的法向贴图与模型一一对应,通常来说模型不会发生形变。 但是对于一些物体,比如说可以编辑的围墙,在保存法线贴图时候我们并不知道围墙各个面的朝向,因此需要将法线保存在切线空间中。

U,V坐标轴构成的一个平面,保存的法线与这个平面垂直 这两个向量,再加上法线向量,就可以定义一个与我们的假设相匹配的三维空间。一旦我们有了这个空间,我们就可以使用它来将凹凸转换到世界空间中去。 附加的向量被提供作为网格的顶点数据的一部分。由于它位于由表面法线限定的平面之中,它被称为切向量T.。按照惯例,这个向量与U轴一致,指向右边。 计算方法: 1)获取模型坐标系下的T(tangent),变换到世界坐标系中,w分量不变。 2)使用世界坐标系下的法线N 和T,叉乘得到次法线B 3 将采样得到的切线空间下的法向量,变换到N,T,B坐标系空间下,得到正确的法向量

2018/7/18

第7章 shadowmap

unity不支持半阴影,支持软阴影。Unity使用shadowmap技术,平行光阴影的渲染选项的时候,Unity开始在渲染过程加入一个深度渲染Pass shadowmap 计算方式 1)首先从摄像机的方向,和渲染一张与屏幕分辨率相匹配的纹理贴图,记录每个片段的深度值 2)然后对每一个光源,渲染一张深度纹理,保存裁剪空间中场景的物体的深度值。 3)收集阴影:将光源深度纹理贴图转换到视点空间, 对于每一个片段,如果摄像机视角的深度值大于光源视角深度纹理的深度值,则这一点被光线被遮挡,否则这一点被照亮,产生最后阴影贴图 4)然后采样阴影贴图就可以了

对于聚光灯 聚光灯具有实际位置,所以聚光灯的相机看到的是一个透视视图,不能任意的旋转。因此,这些光源不能支持级联阴影。 Unity的宏提供了处理聚光灯和平行光的方法

对于点光源 和聚光灯和平行光不同,点光源产生的是一个深度立方体贴图,和上面的宏不一样

2018/7/18 第9 10 章 复杂材质 使用纹理_MetallicMap 保存金属度 和 光滑度信息 使用纹理_EmissionMap 保存自发光信息 使用纹理_OcclusionMap 保存自身遮罩信息

以上可以实现物体表面的各种细节

阴影质量与级联阴影 使用级联阴影的原因:光源与视点产生的深度纹理分辨率不匹配,最终产生的阴影会有锯齿 Unity对每个光源渲染整个场景多次(默认为4),用于产生级联阴影 启用级联阴影的时候,多个阴影贴图将渲染到同一纹理贴图之中。每个阴影贴图只用于一定距离的区域。

2018/7/16

第13章

延迟渲染路径探索,之前用的都是前向渲染

前向渲染流程: 1.在VS中对所有对象的顶点进行一系列的变换,通常是将顶点法线和顶点位置变换到裁剪空间 2.然后在FS中逐个像素进行光照计算,由于每个像素都只调用FS一次,逐像素的计算每个像素的光照效果时,我们需要将所有的光照信息都传递到 FS 中

前向渲染的问题: 1.如果场景十分复杂,有很大的深度复杂度(屏幕上的同一个像素被多个物体覆盖),我们会浪费很多的 GPU 资源。 2.当场景中有很多光源的时候,对于每一个光源,都要一个前向渲染的通道,复杂度就位 光源数量* 场景中物体数量

延迟渲染关键点: 1.首先,同样运行VS进行相似的处理,然后将结果传入到FS之后不直接进行光照计算, 将顶点数据全部写入到Gbuffer中(G buffer 只是一个逻辑集合,它实际上是由多个 2D 纹理组成的,包括4个缓冲区,见shader代码的注释,每一个顶点属性都对应这样一个 2D 纹理。) 由于是从FS将数据写入G buffer ,g buffer 中的数据都是插值数据,同时不想关的数据在深度测试中被丢弃 2.遍历 G buffer 中的每一个像素,对不同的纹理进行采样以获得像素属性,并使用与之前相似的方法来对每个像素进行光照计算。 由于当我们向 G buffer 写数据的时候,所有不是离相机最近的片元都已经被丢弃了,所有我们只需要对纹理中的每一个像素进行一次光照计算即可。

2018/7/16

第十四章 雾

Unity的光源窗口包含了一段场景中雾的设置,window /lighting /other setting Unity中雾的实现,依赖于一些恒定的雾参数 实现方式://雾的效果跟摄像机到观察点的距离相关,这里使用距离,而unity中使用场景的深度值 然后对片段颜色和雾颜色进行插值

线性雾 代表一种吸收光线不会散射的大气,离摄像机越远,物体越模糊,和雾的和强度系数颜色相乘 雾的强度线性增加

指数雾exponential f = exp(-cd) 这个方程永远不会得到零

指数平方雾 f = e^-(cd)^2 能在近距离产生较少的雾,但是它强度增长的速度会更快

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages