Unity-Shader读书笔记完结发言(16)
Unity-Shader读书笔记完结发言(16)
如果大家有买过《Unity
shader入门精要》这本书,那么你一定知道我现在读书笔记的进度并没有到书中的末尾。但我不想继续写下去了。书中剩下的文章有表面着色器,基于物理的渲染、Unity5更新了什么和还有更多内容吗(这个就是书中标题)。其实我如果还要再写下去,那么也就剩下两篇了(最后两篇完全真的没有什么做笔记的必要)。现在是2023.6.14日,我完全也有足够的时间在这个按照我的计划将这两篇读书笔记做完。但是我想现在停下来了。
如果你有好好看上篇文章,那么你一定会看到上篇文章我说过我大多是照抄原文。这个原因自然是我实践太少更本没有什么太多的思想,所以我只能照抄。我现在停下来的原因也差不多。对于表面着色器,作者写的本来就很精简了。如果我要做读书笔记最多是只是多加一些Unity官方文档上所说明的内容。而基于物理的渲染则是我现在知识积累实在太少了而作者剩下的篇幅也只能简单介绍。我个人认为对于这个我除照抄外只剩下一个选择——按照作者给的资料将作者未写完的补全。但我觉得我完全可以去买另一本介绍物理渲染的书籍 ...
Unity-Shader读书笔记(15)
Unity-Shader读书笔记(15)
这边文章大多是讲Unity中的渲染优化技术。
影响性能的因素
书中将影响性能的因素分成了三个方面:
(1)CPU 在CPU方面过多的Draw
Call、复杂的脚本和物理模拟都是消耗性能的原因。所谓Draw
Call就是CPU在每次通知GPU进行渲染之前,都需要提前准备好顶点数据(如位置、法线、颜色和纹理坐标等),然后调用一系列API把它们放到GPU可以访问到的指定位置,最后调用一个绘制指令。而在我们调用绘制指令的时候,就会产生一个Draw
Call。如果一帧中Draw Call数量的过多会导致CPU在调用Draw
Call上花费许多的时间。 (2)GPU
在GPU方面则为过多的顶点/片元(过多的片元可能是由于分辨率或是overdraw造成的)和过多的逐顶点/逐片元计算。
(3)带宽
在带宽方面,项目中使用了没有尺寸大但是没有压缩的纹理,或者存在分辨率过高的帧缓存。
书中提及的优化技术
(1)CPU优化,使用批处理技术来减少Draw Call的数目
(2)GPU优化。在减少需要处理的顶点 ...
Unity-Shader读书笔记(14)
Unity-Shader读书笔记(14)
消融效果
书中的消融效果是使用噪声纹理+透明度测试。我们使用对噪声纹理采样的结果和某个控制消融程度的阈值进行比较,小于阈值则使用clip函数进行裁剪。具体实现如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156Shader "Learn/Dissol ...
Unity-Shader读书笔记(13)
Unity-Shader读书笔记(13)
卡通风格的渲染
卡通风格的实现有很多的方法,其中之一就是使用基于色调的着色技术(tone-base
shading)。在实现中,我们往往使用漫反射系数对一张一维纹理进行采样,以控制漫反射的色调。卡通风格还需要进行描边处理,虽然之前我们已经做过描边了。但是这里是使用的是基于模型的描边方法。
渲染轮廓线
书中介绍了很多方法这些方法都在《Real Time
Rendering》中有提及,这里我就只说书中作者所用的方法。如果大家有兴趣可以去看这本书。
我们将使用两个Pass进行渲染。在第一个Pass中,我们会使用轮廓线颜色渲染整个背面的面片。并在视角空间下把模型顶点沿着法线方向向外扩展一段距离,以此让背部轮廓线可以被看见。但是对于一些内凹的模型就可能发生背面面片遮挡正面的情况。为了尽可能防止出现这样的情况,在扩张背面顶点前,我们先对顶点法线的z分量进行处理。我们让z分量等于一个定值,然后把法线归一化后再对顶点进行扩张。这样的好处在于扩张后的背面更加扁平化,从而降低了遮挡正面面片的可能性。
...
2023.5月总结
2023.5月总结
我已经离职一个多月了。这期间我除了在家附近找找工作外,我还到了厦门去找。可现实总是残酷的,一个月的时间我只得到了一个面试的机会。虽然我通过了,但是我也没觉得开心。毕竟这家开的工资比我之前的还少。不过我也没有选择,毕竟菜就是菜。作为弱者的我根本就没有选择的余地。和我一起离职的同事到是不错,他进了一家还算轻松的公司。除了做得游戏垃圾外,其他都好(各种福利和高额工资,我也想要)。
我在厦门期间暂住在朋友家里,每每朋友回来都会问我今天是否有面试。而我只能苦笑着说没有。朋友也够义气,每次都给我一些建议。而且我在厦门期间还能随便吃他的零食用他的东西。在我求职的过程中,我就不说发一份简历了然后被退回了,就我想和他们聊天他们都不理我。厦门几乎所有用Unity的游戏公司我都投了,0-20人,100-200人,500-1000人等等规模的公司我都投了一遍。我没有一个机会。我每次失败都改一次在线简历,可无论我怎么修改我的在线简历都没有任何用。我实在没办法不去怀疑我自己是否还有想法去做游戏。在我有转行的意向时,朋友也帮着我分析现在我要去转什么。这一个月我 ...
Unity-Shader读书笔记(12)
Unity-Shader读书笔记(12)
在游戏开发过程中,我们会需要获取到深度纹理和法线纹理来实现特定的屏幕后处理效果。
深度和法线纹理的原理
深度纹理就是一张渲染纹理,但是它存储的是一个高精度的深度值。因为深度值被存储在纹理中,所以深度值的大小范围为[0,1],且为非线性分布。在我们进行投影变换后得到的NDC(就是变成正方体空间那个)。那么它的z轴分量就是在[-1,1]之间(像DirectX这些则是在[0,1]之间)。所以我们要通过类似之前法线纹理一样将z分量控制[0,1]之间。
在Unity中获取深度纹理有两种方式:一种是直接取深度缓存,另一种则是由一个单独的Pass进行渲染得到。这个取决于使用的渲染路径和硬件。通常来说,如果我们使用延迟渲染路径,它会将深度信息存储在G-Buffer中,所以我们能直接获取。如果我们要使用Pass进行获取,那么我们务必要给这个Pass设定正确的渲染路径。Unity会使用着色器替换技术选择那些渲染类型(即SubShader的RenderType标签)为Opaque的物体,判断它们使用的渲染队列是 ...
Unity-Shader读书笔记(11)
Unity-Shader读书笔记(11)
屏幕后处理特效(screen post-processing
effects)是游戏中实现屏幕后处理特效的常见方法。屏幕后处理通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。我们使用这种技术可以为游戏画面添加更多的艺术效果,比如景深(Depth
of Field)、运动模糊(Motion Blur)等。
建立一个基本的屏幕后处理脚本系统
想要实现屏幕后处理,我们先要抓取屏幕图像。Unity提供了OnRenderImage函数(MonoBehaviour-OnRenderImage(RenderTexture,RenderTexture)
- Unity 脚本
API)就可以帮我们做到。在这个函数中,我们通常是使用Graphics.Blit(Graphics-Blit
- Unity 脚本
API)函数来完成对渲染纹理的处理。一般而言OnRenderImage函数会在所有的不透明和透明Pass执行完毕后被调用,以便对场景中所有游戏对象都产生影响。但是有时候我 ...
Unity-Shader读书笔记(10)
Unity-Shader读书笔记(10)
这篇文章主要讲如何使用Unity
Shader内置的时间变量来实现动画效果。而Unity
Shader中内置的时间变量大家可以看官网的描述:内置着色器变量
- Unity 手册。
纹理动画
序列帧动画
序列帧动画是一种常见的动画形式之一,其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放从而形成动画。git也是差不多的原理。
PS:序列帧动画是使用Assets.png图片。然后我们只需要一个Quad让其正对摄像机就可以了。
具体代码如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172Shader "learn/SequenceAnimationShader"{ Properties ...
Unity AB包学习笔记
Unity AB包学习笔记
前言
这个笔记是我看b站教程所记录下来的笔记。大家可以去b站看一下这个教程:b站教程。
了解什么是AB包
AB包就是特定于平台的资产压缩包,有点类似压缩文件。这些资产包括∶模型、贴图、预设体、音效、材质球等等。但是它不支持将代码一并打包。
AB包的作用
AB包相对于Resources加载,它可以更好的管理资源。Resources在项目出包的时候就被定死了,它是只读且无法修改。在Resources文件下的文件,无论是否被工程使用到它都会被打包。而AB包存储位置可自定义,压缩方式自定义且后期可以动态更新。而且AB包可以减少包体大小。这是因为AB包本身就有压缩资源,如果我们将AB包放置到网络上然后让玩家在包体安装好后再去下载AB包。那么初始包的包体大小就会减少了。(之所以减少包体大小是因为不同的包体大小每次宣发量是不一样的。我之前工作的时候听运营聊过100mb的包和100mb以下的包,宣发的钱差多了。)除此之外,AB包也支持热更新。
生成AB包资源文件
PS:我使用的Unity版本为2019.4.40 ...
Unity-Shader读书笔记(9)
Unity-Shader读书笔记(9)
高级纹理
立方体纹理(CubeMap)
在图形学中,立方体纹理是环境映射(Environment
Mapping)的一种实现方法。环境映射可以模拟物体周围的环境,而使用了环境映射的物体看起来像镀了层金属一样反射出周围的环境。
立方体纹理一共包含了6张图像,这些图像对应着立方体的6个面。在之前的普通纹理中,我们使用uv坐标进行采样。而在立方体纹理中,我们使用一个三维的向量值进行采样。这个方向矢量的起点位于立方体纹理的中心,然后按照矢量的方向延伸。最终这个方向向量会在立方体纹理6个面之间相交,而采样值就是通过交点计算出来的。
立方体纹理的优点在于它实现简单快速,而且得到的效果也好。但它同时也有缺点,如果场景中引入了新的物体、光源或者物体发生移动时,我们就要重新生成立方体纹理。立方体纹理不能反射使用该立方体纹理的物体,也就是说立方体纹理不能进行多次反射。、
立方体纹理在实时渲染中有很多的应用,最常见的就是用于天空盒(SkyBox)以及环境映射。
天空盒
天 ...




