Unity Shader入门精要学习笔记:非真实感渲染
前言
尽管游戏渲染一般是以照相写实主义作为主要目标,但也有一些游戏使用了非真实感渲染(Non-Photorealistic Rendering,NPR),例如卡通,水彩风格等。
卡通风格的渲染
要实现卡通渲染有很多方法,其中之一就是使用基于色调的着色技术。
在卡通风格中,模型高光往往是一块块分界明显的纯色区域。
渲染轮廓线
在《Real Time Rendering, third edition》一书中,作者把这些方法分成5种类型。
基于观察角度和表面法线的轮廓线渲染,这种方法使用视角方向和表面法线的点乘结果来得到轮廓线的信息,可以在一个Pass中就得到渲染结果,但局限性很大,效果也不尽如人意。
过程式集合轮廓线渲染,使用两个Pass渲染,第一个Pass渲染背面的面片,并使用某些技术让它轮廓可见,第二个Pass再正常渲染正面的面片,这种方法快速有效,并且适用于绝大多数表面平滑的模型,缺点是不适合类似于立方体这样平整的模型。
基于图像处理的轮廓线渲染,适应面较广,缺点是一些深度和法线变换很小的轮廓无法被检测出来,例如桌子上的纸张。
基于轮廓边检测的轮廓线渲染,前几个方法最大问 ...
Unity使用NavMeshPath实现NavMeshAgent匀速移动
前言
为了准备老师的课设作业,我决定做一个RPG小游戏,在处理寻路的时候遇到了点小麻烦。
首先是解决方案的选取,Unity自带的Navgation Mesh挺强大的(至少在客户端是这样,hh),我之前一直用的A*,但是不知道为什么老版本的A*在Unity 2019.3的InspectorGUI是坏掉的。。。又没钱买正版。。。
emmm,勉为其难的选择Navgation Mesh吧。
但是Navgation Mesh好像只有带有加速度的移动方式,这就有点蛋疼,说实话我个人挺不喜欢那种手感的,所以查了查官方文档,发现了NavMeshPath这么个东西,用它就可以得到我们一次寻路过程中所有的转折点,从而自己处理寻路,那么,我们开始吧。
思路
通过调用NavMeshAgent的CalculatePath来得到NavMeshPath,并使用NavMeshPath的corners数组(记录了每一处拐点的位置)和Transform.Translate做匀速运动,人物方向的改变需要自己处理。
代码
重要部分已注释,核心就是RunToTarget函数
1234567891011121314151 ...
个人开源项目展示
本博客持续更新。欢迎大家和我交流讨论。所有美术素材均来自网络,如有侵权,联系我删除。
视频介绍
相关视频介绍
游戏作品
Space Shooter Tutorial For Android(紧张刺激的太空飞机大战)
源码链接:
LinkUp(经典连连看游戏,集成死局判定功能)
源码链接:
Battle City Based On GF (经典的坦克大战,微创新)
源码链接:
NKG Moba Based On ET(基于ET的Moba游戏,开发中。。。)
源码链接:
框架相关
NKGFramework(基于C#的客户端,服务端,热更新完整框架)
源码链接:
工具相关
可视化结点技能编辑器(数据向)
源码链接:
目标导向的AI系统——GOAP(多线程,JobSystem)
源码链接:
GitHub优秀开源项目镜像
Duke的ET版本,整合FGUI和可热更双端行为树
源码链接:
Node_Editor_Framework,可视化结点编辑器,非常强大的可视化结点编辑器,可以根据项目深度定制
源码链接:
xAsset,轻便的Unity资源管理框架
源码链接:
ET框架 ...
使用Graphiz程序化生成UML的完整工作流
前言
想必大家在整理学习一个项目架构时会用到类似UML这样的类图来表述各个模块之间的关系,但是当一个系统很庞大时,我们的UML也会很大,如果项目架构变动或者自己哪里搞错了,基本上就是一场连连看灾难,今天就给大家安利一下Graphiz,用它来程序化生成我们想要的UML图。 我第一次接触这个插件是在一个AI开源库里,使用了Graphiz输出AI决策图,就像这样
甚至这样
很难想象如果人为的去画这些图是怎样的一副光景。
当然了,上面那两个例子可能并不是很中肯,因为我们平时剖析的架构往往没有这么井井有条,他可能会是这样
不过这都没有关系,在Graphiz中,我们只需要写好代码,这些图都会自动生成啦。
正文
Graphiz简介
图形化是一种将结构信息表示为抽象图形和网络图的方式。自动图形绘制在软件工程,数据库和Web设计,网络以及许多其他领域的可视界面中具有许多重要的应用。 Graphviz是开源的图形可视化软件,用户只需要编写dot语言然后让Graphviz读取,即可生成自己想要的UML图。官网:http://www.graphviz.org/about/
Graphiz下载 ...
《白色相簿2》观后感
命运的齿轮开始转动
当你粗糙的大手抓住我时,你我的人生就注定纠缠不休了了吧。
最后的Sunny Day
啊,想必当时的我们没人知道这会是我们三人最后一次心无杂质的在一起了吧。
转折点
雪菜的告白我不知道该如何拒绝,可是,明明,明明是你先来的,你为什么不叫醒我呢?你不说,我怎么会知道!
她是害怕我们三人会分离,还是真的喜欢我?还是两者都有?不过都已经不重要了,那一次的我们,错过了彼此。
须臾冬至
“好想一直这样下去呢”
“嗯”
你答应着,有些落寞,又有些悲哀,因为你自己知道,我们三个不再可能在一起了。
形同陌路的心与心
我们开始为各自的未来考虑,我和雪菜的未来有你,但你的未来,没有我们。
蓦然雪化 且静候 飞雪再临之时
你从小缺少家人的关怀,有些许性格缺陷,所以才会对我们三个人的感情如此敏感吧。
“率先离开的人是你吧!”
“擅自跑到我难以企及的地方的人是你才对吧!”
“明明让我无法企及。。。却还要我一直待在你的近旁”
“想出这种酷刑的的人也是你吧。。。”
“可是 为什么我现在还非得被你们苛责不可”
“每一天 每一天 出现在我面前”
“让我不断地心如刀割”
“难道 ...
《伤物语》观后感
这是一段人与吸血鬼之间相互救赎,相濡以血的故事
动画制作组非常用心,画面表现手法非常独特,从下面的截图也可以看出来,还有一些旁白插入的制作手法也非常有感觉
《伤物语》是一个集魔幻,友情,爱情,搞笑,悲伤,战斗,热血于一体的艺术品
主人公的内心变化也非常多,从彷徨,懦弱到坚定,勇敢
总之是一个很推荐大家去观看的动漫
我们从《伤物语》始,也从《伤物语》终
伤痕累累的我们,相互慰藉
你若明日死,那我的生命也将止于明日
你若活过今日,那我也将陪你活过今日
我们的伤物语,就此开始
这是一段血之物语,濡血而赤,血涸而黑
它讲述着我们宝贵的,永世不愈之伤
这段物语,我将不会向任何人提起
Unity Shader入门精要学习笔记:高级纹理
高级纹理
立方体纹理
立方体纹理是环境映射的一种实现方式,和之前使用二维纹理坐标不同,对立方体纹理采样我们需要提供一个三维的纹理坐标,这个三维纹理坐标表示了我们在世界空间下的一个3D方向,这个方向矢量从立方体的中心出发,当它向外部延伸时就会和立方体的6个纹理之一发生相交,而采样得到的结果就是由该交点得来的。
它的实现简单快速,而且得到的效果也比较好,但它也有一些缺点,例如当场景发生变化时,我们就需要重新生成立方体纹理,并且立方体纹理也仅可以反射环境,但不能反射使用了该立方体纹理的物体本身。
我们应该尽量对凸面体而不要对凹面体使用立方体纹理。(因为凹面体会反射自身)。
天空盒
天空盒是在所有不透明物体之后渲染的,而背后使用的网格是一个立方体或者是一个细分后的球体。
创建用于环境映射的立方体纹理
第一种方法是直接由一些特殊布局的纹理创建。
我们只需要把纹理的Texture Type设置为Cubemap即可。可以对纹理数据进行压缩,而且可以支持边缘修正,光滑反射(glossy reflection)和HDR功能。
第二种方法是由脚本生成。
我们往往希望根据物体在场景中位置的不同, ...
Unity Shader入门精要学习笔记:Unity中的基础光照
## 我们如何看待这个世界的
通常,我们要模拟真实的光照环境来生成一张图像,需要考虑三种物理现象。
首先,光纤从光源中被发射出来
然后,光线与场景中的一些物体相交,一些光线被物体吸收了,而另一些光线被散射到其他方向。
最后,摄像机吸收了一些光,产生了一张图像。
光源
在实时渲染中,我们通常把光源当成一个没有体积的点,用I表示他的方向。用辐照度来量化光。对于平行光,它的辐照度可通过计算在垂直于I的单位面积上单位时间内穿过的能量来得到。
在计算光照模型时,我们需要知道一个物体表面的辐照度,而物体表面往往是和I不垂直的,那么如何计算这样的表面辐照度呢?我们可以使用光源方向I与表面发现n之间的夹角余弦值来得到。默认方向矢量模为1.
吸收和散射
光线由光源发射出来后,就会与一些物体相交。通常相交结果有两个:散射和吸收
散射只改变光线方向,但不改变光线的密度和颜色。而吸收只改变光线的密度和颜色,但是不改变光线方向。
光线在物体表面经过散射后,有两种方向,一种会散射到物体内部,这种现象被称为折射或者透射。另一种会散射到外部,这种现象被称为反射。
为了区分这两种不同的散射方向,我们在光照模 ...
Unity Shader入门精要学习笔记:更复杂的光照
更复杂的光照
Unity的渲染路径
Unity的渲染路径决定了光照是如何应用到Unity Shader中的。
Unity支持多种类型的渲染路径,主要有三种:前向渲染路径(Forward Rendering Path),延迟渲染路径(Deferred Rendering Path),顶点照明渲染路径(Vertex Lit Rendering Path)(在Unity 5.0后被抛弃)。
如果当前显卡不支持所选择的渲染路径,Unity就会自动使用更低一级的渲染路径。
通俗来讲,指定渲染路径是我们和Unity的底层渲染引擎的一次重要沟通。
如果不指定渲染路径,一些光照变量很可能不会被正确赋值。
前向渲染路径
前向渲染路径的原理
每进行一次完整的前向渲染,我们需要渲染该对象的渲染图元,并计算连个缓冲区的信息:颜色缓冲区和深度缓冲区。我们利用深度缓冲来决定一个片元是否可见,如果可见就更新颜色缓冲区的颜色值。
对于每个逐像素光源,我们都需要进行上面一次完整的渲染流程。如果一个物体在多个逐像素光源的影响区内,那么该物体就需要执行多个Pass,每个Pass计算一个逐像素光源的光照结果,然后 ...
Unity Shader入门精要学习笔记:屏幕后处理效果
建立一个基本的屏幕后处理脚本系统
屏幕后处理通常是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效。例如景深(Depth of Field),运动模糊(Motion Blur)等。
要实现屏幕后处理的基础在于得到渲染后的屏幕图像。
123456/// <summary>/// 抓取屏幕图像/// </summary>/// <param name="src">Unity会把当前渲染的得到的图像存储在第一个参数对应的源渲染纹理中</param>/// <param name="dest">目标渲染纹理</param>MonoBehaviour.OnRenderImage (RenderTexture src, RenderTexture dest)
12345678910111213/// <summary>/// 完成对渲染纹理的处理/// </summary>/// <param name="sourc ...