Unity Shader入门精要学习笔记:基于物理的渲染
引言 随着计算机的处理能力越来越强,人们开始考虑使用更加复杂的算法来渲染更加真实的画面。 在二十世纪八十年代左右, 基于物理的渲染技术(Physically Based Shading, PBS) 首次被引入图形学的正统研究中,学者们提出了使用光线追踪的方法来渲染全局光照,由此打开了精确渲染光线传播的大门。 在实时渲染领域, 人们也发现了这种基于物理的光照模型的巨大优势。 在这之前, Lambert光照模型、 Phong 光照模型和 Blinn-Phong 光照模型等经验模型占据了主流。 然而,这种不满足能量守恒的光照模型使得美术人员需要花费大量的时间在参数调节上。 尤其是, 美术人员往往好不容易为一个物体调节好了所有参数,使得它在当前的光照条件下看起来是满意的。然而, 一旦光照环境发生了变化, 这一切都得从头再来。 因此, 近年来游戏从业者开始着手把基于物理的光照模型应用于实时渲染中。 PBS的理论和数学基础 光是什么 在物理学中,光是一种电磁波。首先,光由太阳或其他光源中被发射出来,然后与场景中的对象相交,一些光线被吸收(absorption),而另一些则被散射(scatte...
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="sour...
Unity Shader入门精要学习笔记:基础纹理
前言 纹理最初的目的就是使用一张图片来控制模型的外观。 在美术人员建模的时候,通常会在建模软件中利用纹理展开技术,把纹理映射坐标存储在每个顶点上。纹理映射坐标定义了该顶点在纹理中对应的2D坐标。 通常这些坐标使用一个二维变量(u,v)来表示,其中u是横向坐标,而v是纵向坐标,因此纹理映射坐标也被称为UV坐标。 但顶点UV坐标的范围通常都被归一化到[0,1]范围内。纹理采样时使用的纹理坐标不一定是在[0,1]范围内。实际上,这种不在[0,1]范围内的纹理坐标又是会非常有用,与之关系紧密的是纹理的平铺模式,它将决定渲染引擎在遇到不在[0,1]范围内的纹理坐标时如何进行纹理采样。 单张纹理 我们通常会使用一张纹理来代替物体的漫反射颜色。 实践 我们使用Blinn-Phong光照模型来计算光照。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787...
Unity Shader入门精要学习笔记:开始Unity Shader学习之旅
一个最简单的顶点/片元着色器 顶点/片元着色器的基本结构 123456789101112131415161718192021222324252627282930// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'shader "Unity Shader Book/Chapter 5/Simple Shader"{ SubShader { Pass { CGPROGRAM //表示vert函数是顶点着色器代码 #pragma vertex vert //表示fragment函数是片元着色器代码 #pragma fragment frag float4 vert(float4 v : PO...
Unity Shader入门精要学习笔记:非真实感渲染
前言 尽管游戏渲染一般是以照相写实主义作为主要目标,但也有一些游戏使用了非真实感渲染(Non-Photorealistic Rendering,NPR),例如卡通,水彩风格等。 卡通风格的渲染 要实现卡通渲染有很多方法,其中之一就是使用基于色调的着色技术。 在卡通风格中,模型高光往往是一块块分界明显的纯色区域。 渲染轮廓线 在《Real Time Rendering, third edition》一书中,作者把这些方法分成5种类型。 基于观察角度和表面法线的轮廓线渲染,这种方法使用视角方向和表面法线的点乘结果来得到轮廓线的信息,可以在一个Pass中就得到渲染结果,但局限性很大,效果也不尽如人意。 过程式集合轮廓线渲染,使用两个Pass渲染,第一个Pass渲染背面的面片,并使用某些技术让它轮廓可见,第二个Pass再正常渲染正面的面片,这种方法快速有效,并且适用于绝大多数表面平滑的模型,缺点是不适合类似于立方体这样平整的模型。 基于图像处理的轮廓线渲染,适应面较广,缺点是一些深度和法线变换很小的轮廓无法被检测出来,例如桌子上的纸张。 基于轮廓边检测的轮廓线渲染,前几个方法最大问题...
Unity Shader入门精要学习笔记:使用噪声
消融效果 常见于游戏中角色死亡,地图烧毁等效果,这些效果中,消融往往从不同区域开始,并向看似随机的方向扩张,最后整个物体消失不见。 下面是来自《英魂之刃口袋版》的一个击杀特效: 原理非常简单,就是噪声纹理+透明度测试。我们使用对噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就是用clip函数把它对应的像素裁剪掉,也就是被“烧毁的部分”,镂空区域边缘的烧焦效果则是将两种颜色混合,再用pow函数处理后,与原纹理颜色混合后的结果。 12345678910111213141516171819202122232425262728293031323334353637383940414243using UnityEngine;using System.Collections;/// <summary>/// 控制消融动画的辅助脚本/// </summary>public class BurnHelper : MonoBehaviour{ public Material material; [Range(0.01f, 1.0f)] ...
Unity Shader入门精要学习笔记:使用深度和法线纹理
前言 在进行边缘检测时,直接利用颜色信息会使检测到的边缘信息受物体纹理和光照等外部因素影响,得到很多我们不需要的边缘点。 我们可以在深度纹理和法线纹理上进行边缘检测,这些图像不会受光照和纹理的影响,仅仅保存了当前渲染物体的模型信息,通过这样的方式检测出来的边缘更加可靠。 获取深度和法线纹理 背后的原理 深度纹理实际就是一张渲染纹理,里面存储的像素值是高精度的深度值,由于被存储在一张纹理中,深度纹理中深度值范围为[0,1],通常是非线性分布的。 这些深度值来自于顶点变换后得到的归一化的设备坐标(NDC)。 看下面一组透视相机投影变换的过程图(使用的变换矩阵是非线性的),最左边是投影变换前(观察空间下视锥体的结构及相应的顶点位置),中间是应用透视裁剪矩阵后的变换结果(顶点着色器阶段输出的顶点变换结果),最右边是底层硬件进行了透视除法后得到的归一化的设备坐标。 看下面一组正交相机投影变换的过程图(使用的变换矩阵是线性的) 在得到NDC后,深度纹理中的像素值就可以很方便的计算得到了,这些深度值就对应了NDC中顶点坐标的z分量的值,由于NDC中z分量的范围在[-1,1],为了让这些值能...
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函数 12345678910111213141516...
个人开源项目展示
本博客持续更新。欢迎大家和我交流讨论。所有美术素材均来自网络,如有侵权,联系我删除。 视频介绍 相关视频介绍 游戏作品 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框架,纯C...
使用Graphiz程序化生成UML的完整工作流
前言 想必大家在整理学习一个项目架构时会用到类似UML这样的类图来表述各个模块之间的关系,但是当一个系统很庞大时,我们的UML也会很大,如果项目架构变动或者自己哪里搞错了,基本上就是一场连连看灾难,今天就给大家安利一下Graphiz,用它来程序化生成我们想要的UML图。 我第一次接触这个插件是在一个AI开源库里,使用了Graphiz输出AI决策图,就像这样 甚至这样 很难想象如果人为的去画这些图是怎样的一副光景。 当然了,上面那两个例子可能并不是很中肯,因为我们平时剖析的架构往往没有这么井井有条,他可能会是这样 不过这都没有关系,在Graphiz中,我们只需要写好代码,这些图都会自动生成啦。 正文 Graphiz简介 图形化是一种将结构信息表示为抽象图形和网络图的方式。自动图形绘制在软件工程,数据库和Web设计,网络以及许多其他领域的可视界面中具有许多重要的应用。 Graphviz是开源的图形可视化软件,用户只需要编写dot语言然后让Graphviz读取,即可生成自己想要的UML图。官网:http://www.graphviz.org/about/ Graphiz下载与环...