UnityShader
O213
这个作者很懒,什么都没留下…
展开
-
Shader笔记——使用粒子序列图实现体积云
最近看到一个效果还不错的体积云,了解了下其实现原理,将其实现思路做一个简单的整理和记录,并重写该Shader其效果图:该效果来自名为CloudPuff的Unity资源包中示例场景截图实现的主要思路为: 使用MatCap对预先存储的光照进行采样 MatCap是使用存储了视空间下不同法线方向的球形光照纹理,在计算光照时直接对纹理进行采样,运算效率高,但也有其局限,只能适用于单...原创 2019-10-31 15:35:29 · 3637 阅读 · 1 评论 -
Shader笔记十四 屏幕后处理效果
屏幕后处理是指渲染完整个场景得到屏幕图像后,再对屏幕图像做处理,实现屏幕特效。实现屏幕后处理效果的关键在于得到渲染后的屏幕图像,Unity提供了对应的接口 OnRenderImage ,其函数声明MonoBehaviour.OnRenderImage(RnederTexture src, RenderTexture dest) 参数 src :源纹理,用于存储当前渲染的得到的屏幕图像参数 d...原创 2018-06-13 14:37:32 · 679 阅读 · 0 评论 -
Shader笔记十五 获取深度和法线纹理
很多时候不仅需要当前屏幕的信息,同时希望得到深度和法线信息。例如在做边缘检测时,是直接根据渲染完后的屏幕图像的RGB值进行计算的,如果某些物体受到阴影的影响,那么检测结果就不一定准确。如果可以直接在深度纹理和法线纹理上进行边缘检测,那么就不会受到场景中的阴影的影响。获取深度和法线纹理首先深度纹理是一张纹理图,既然是一张纹理图,那么其值的范围是在[0,1]之间的,那么这个值的范围是如何转化得到的呢?...原创 2018-06-13 14:37:55 · 1845 阅读 · 0 评论 -
Shader笔记十六 利用深度纹理实现更多特效
利用深度纹理实现运动模糊之前实现的运动模糊是通过混合多张屏幕图像来模拟运动模糊。另一种实现运动模糊的方式是通过速度映射图,而且该方式应用更加广泛。速度映射图中存储每个像素的速度,使用该速度决定模糊的方向和大小。生成速度缓冲可以将场景中所有物体的速度渲染到一张纹理中,不过该方法需要修改场景中所有物体的Shader代码,使其添加计算速度的代码并输出到下一个渲染纹理中。有一种方法是通过深度纹理在片元着色...原创 2018-06-13 14:38:10 · 987 阅读 · 0 评论 -
Shader笔记十七 卡通渲染
卡通风格渲染的游戏画面通常物体颜色分界明显,具有黑色的线条描边。卡通渲染的实现有多种方法,基于色调的着色技术是其中之一,实现过程中通过使用漫反射系数对一维纹理进行采样,控制漫反射色调。之前通过一张渐变纹理来控制漫反射颜色实现过卡通风格的渲染效果。卡通风格的高光效果往往是一块分界明显的色块,而物体边缘通常会有描边。本节中将通过基于模型的方式进行描边,而不是之前的屏幕后处理的方式。轮廓线渲染轮廓线的渲...原创 2018-06-13 14:38:25 · 2849 阅读 · 0 评论 -
Shader笔记十八 噪声纹理的利用
噪声的使用会使结果充满随机性,从而表现效果更加自然。消融效果消融效果常在游戏中角色死亡,物品烧毁中被使用。消融效果往往从不同区域开始,并向看似随机的方向进行扩张,最后整个物体都消失不见。消融效果可以通过噪声纹理+透明度测试去实现。使用对噪声纹理进行采样的结果与某个控制消融效果的阈值进行比较,小于阈值,使用clip函数将该像素点裁剪掉,对应被烧毁的部分,而边缘部分的烧焦效果则将两种颜色进行混合,在使...原创 2018-06-13 14:39:05 · 2309 阅读 · 2 评论 -
噪声学习
关于噪声噪声在图形学中的使用非常普遍,这里的噪声是通过程序生成一系列的随机值,通过特定的噪声算法,在给定一个输入,生成对应输出,输入和输出可以是不同维数的组合。 噪声在图形学中常用来模拟火焰、地形、云朵等包含随机变化的对象。既然是获得随机值,为何不直接使用类似 random 这样的随机函数呢?原因是随机函数所得到的值在既定范围内分布过于均匀,这样的随机值被称为"白噪声",二维白噪声的纹理为:...原创 2018-07-31 18:27:20 · 1857 阅读 · 0 评论 -
Shader笔记十九——三种凹凸纹理实现
Normal Map法线纹理是通过一张与漫反射纹理相对应的法线图,存储法线信息,使用的时候对应纹理坐标进行采样,通过法线值影响光影计算的结果,从而产生凹凸效果。Normal Map可能是目前使用最为广泛的一种凹凸贴图技术了。之前的内容也有介绍过, https://zhuanlan.zhihu.com/p/31450857 这里不详述。贴一下Shader代码:Shader "Bump/00...原创 2018-09-13 12:02:04 · 2418 阅读 · 0 评论 -
Shader笔记二十——带噪声的能量盾实现
先上效果: 该效果的实现主要分为两个部分:能量盾与场景相交处的高光处理 能量盾的纹理变化能量盾与场景相交处的高光处理能量盾与场景中其他物体的相交部分的高光,主要是通过比较能量盾自身的深度值与场景内相交的部分物体的深度值,通过两者深度值的差异大小来决定高亮颜色的显示比例插值:float diff =pow((1-saturate(sceneZ-i.scrPos.z))/1.0...原创 2018-09-20 15:02:09 · 999 阅读 · 0 评论 -
初识Unity SRP
Unity SRP 即 Unity Scriptable Rendering Pipeline(可编程渲染管线),是Unity 2018的新功能,使开发者可以通过脚本按需构建自己的渲染过程。在学习和参考:吉祥的游戏编程笔记中关于Unity SRP的相关内容后,这里做一个简单的学习记录,如有错误之处,希望可以多多交流。SRP中的内容可以用一张图说明: SRP的创建过程分为3个部分:Cu...原创 2018-10-23 19:09:47 · 8437 阅读 · 6 评论 -
笔记二十一 RayMarch简单实践01_SimpleRayMarchingScene
写在前面光线追踪简单来说是通过若干条从摄像机发出的光线,通过步进的方式去和场景中的物体求交,根据交点处的信息和光源信息计算交点处的光照。 这种方式区别于与光栅化渲染,也就是将场景中物体的三角面通过空间的变换最终映射到屏幕上,并将三角面覆盖的区域逐像素处理,做插值计算。关于光线追踪的简化处理过程,可以参考下图(网络截图,侵删):入门简单实践根据光线追踪的处理思路,实现步骤可简化如下:获取摄...原创 2018-12-28 10:12:57 · 845 阅读 · 0 评论 -
笔记二十二——RayMarch简单实践02 Simple-SDF-RayMarchingScene
写在前面在上一篇笔记中,通过从摄像机发出射线,并采用步进的方式求解场景中的碰撞点,利用碰撞点信息进行着色,在屏幕上绘制了一个Sphere和Plane,本篇笔记中将丰富上一个场景,并做相对复杂的光照处理。采取和上篇中绘制Sphere,Plane相同的方式绘制更多的三维图形,因此需要引入更多距离计算函数,也就是SDF(Sign Distance Functions),这些函数用来计算空间中点到目标模...原创 2018-12-28 15:18:20 · 909 阅读 · 0 评论 -
Shader笔记十三 通过顶点位置判断实现类似黑洞效果
该效果的首发在https://zhuanlan.zhihu.com/p/32131147参考喵神的优化建议,自己对其中代码做了部分优化,自己实现的效果:该效果的核心思想在与判断角色模型与场景中的“黑洞”的位置和距离关系,当两者距离到达一个阈值时,开始受到类似吸引的效果,实际上是将顶点向“黑洞“的方向靠近,若变化后的新顶点超过了”黑洞“的位置,则将其位置设置为”黑洞“的位置,即被吞噬,因此这个变化过...原创 2018-06-13 14:36:35 · 1784 阅读 · 0 评论 -
Shader笔记十二 动画效果
动画效果动画效果需要引入时间变量,Unity内置的时间变量:这些时间变量可以用来实现纹理动画和顶点动画纹理动画序列帧动画序列帧动画是通过依次播放一系列关键帧图像,当播放速度达到一定数值时,看起来就像是一个连续的动画。灵活性较强,通过一张包含关键帧的图像可以得到比较细腻的动画效果,缺点在于需要大量时间制作包含关键帧的图像。关键帧实现的关键在于,每个时刻计算该时刻下应该播放的关键帧的位置完整代码 Sh...原创 2018-06-13 14:36:14 · 317 阅读 · 0 评论 -
Shader笔记十一 高级纹理
高级纹理立方体纹理立方体纹理(CubeMap)是 环境映射(Enviroment Mapping) 的一种实现方式。立方体纹理包含6张图像,每个面表示沿着世界空间下的轴向(上、下、左、右、前、后) 观察所得的图像。对立方体纹理的采样需要提供三维纹理坐标,表示在世界空间下的一个3D方向,方向矢量从立方体中心出发,向外部延伸就会和立方体的6个纹理之一发生相交,采样结果由交点计算而来。立方体纹理在实时渲...原创 2018-06-13 14:35:55 · 370 阅读 · 0 评论 -
Unity Shader中的 ZTest & ZWrite
Part1 理论部分ZTest:深度测试,开启后测试结果决定片元是否被舍弃,可配置 ZWrite:深度写入,开启后决定片元的深度值是否写入深度缓冲,可配置ZTest可设置的测试规则:ZTest Less:深度小于当前缓存则通过ZTest Greater:深度大于当前缓存则通过ZTest LEqual:深度小于等于当前缓存则通过ZTest GEqual:深度大于等于当前缓存则通过ZTest Equa...原创 2018-06-08 08:42:21 · 19290 阅读 · 0 评论 -
Shader笔记一 Unity Shader概念篇
渲染流水线渲染流水线从概念部分分为三个部分:应用阶段应用阶段为开发者完全控制部分,主要提供渲染所需要的渲染数据,输出为渲染图元,该阶段可以细分为:加载渲染数据(HDD-->RAM-->VRAM)设置渲染状态(决定场景中的网格(图元)以怎样的方式渲染,使用什么着色器,光照,材质)调用DrawCall命令(指定需要渲染的图元列表,发起方为CPU,接收方为GPU)几何阶段几何阶段的部分过程可...原创 2018-06-10 10:54:08 · 366 阅读 · 0 评论 -
Shader笔记二 相关数学内容
变换变换指将一些数据,例如,点,方向矢量甚至颜色,通过某种方式进行转换的过程。线性变换是非常常见的一种变化类型,满足矢量加和标量乘的变换即为线性变换,即:f(x)+f(y)=f(x+y)kf(x)=f(kx)缩放和旋转是一种线性变换,错切,镜像,正交投影也是线性变化。平移不属于线性变化,比如f(x)=x+(1,2,3),因为不满足矢量加和标量乘的运算。线性变换使用3X3的矩阵即可表示,但由于平移变...原创 2018-06-10 10:58:52 · 316 阅读 · 0 评论 -
Shader笔记三 第一个Unity Shader
顶点/片元着色器基本结构Unity Shader基本结构包含:Shader、Properties、SubShader、Fallback,即:Shader "MySahder"{ //属性部分,使材质面板可见 Properties{ } //SubShader A SubShader{ //通道Pass Pass{ //设置渲染状态及标签 //开始CG代码片段 ...原创 2018-06-10 11:02:14 · 215 阅读 · 0 评论 -
Shader笔记四 Unity Shader中的基础光照
着色是根据材质属性(高光反射属性,漫反射属性等)、光源信息(如光源方向、辐照度等),使用等式去计算沿某个观察方向的出射度的过程。该等式即 光照模型(Lighting Model) 。光照模型中包含不同的部分来计算光线经过物体表面后不同的方向高光反射部分:表示光线在物体表面如何被反射漫反射部分:表示光线在物体表面如何被折射,吸收和散射出表面标准光照模型标准光照模型将进入到摄像机内的光线分为4部分,每...原创 2018-06-10 11:06:11 · 2202 阅读 · 0 评论 -
Shader笔记五 基础纹理
通常使用一张纹理来代替物体的漫反射颜色。使用纹理的Shader中,需要对纹理进行采样。 使用CG的tex2D(_MainTex,uv)函数进行纹理采样,第一个参数是需要被采样的纹理,第二是float2类型的纹理坐标,该坐标在顶点着色器中由_MainTex_ST对定点纹理坐标进行变换得到。Shader "Custom/Chapter7_SingleTexture" { Properties{ ...原创 2018-06-10 11:11:16 · 1024 阅读 · 0 评论 -
Shader笔记六 透明效果
Unity中使用两种方法实现透明效果:透明度测试(Alpha Test)透明度混合(Alpha Blending)开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色和深度值之外,还具有透明度的属性。透明度为1时,完全不透明,透明度为0时,完全透明。关于渲染顺序对于不透明物体的渲染由于有深度缓冲(depth buffer,z-buffer),不考虑渲染顺序也能得到正确的渲染结果。使用深度缓...原创 2018-06-10 11:15:56 · 2428 阅读 · 0 评论 -
Shader笔记七 剔除正面的描边效果
使用两个Pass可以实现模型描边效果,一个Pass正常渲染图元,另一个Pass中剔除正面,并在裁剪空间对定点进行移动,移动的方向为顶点对应的法线方向,这样在经过逐片元操作后背面会生成面片,由于Pass按照顺序渲染,因此只有超出模型边缘的面片会显示出来,然后指定面片颜色,即可实现类描边效果。实例代码:Shader "Custom/GeometryEdge" {Properties{ _Color...原创 2018-06-10 11:45:22 · 919 阅读 · 0 评论 -
Shader笔记八 利用顶点投射生成阴影
最近在喵神的专栏里看到了这个实现方法:https://zhuanlan.zhihu.com/myashader自己试着写了下看看效果,主要思想是在顶点着色器内根据光源,顶点和地面的位置关系,利用相似原理计算投影点,xz平面即为场景中的固定高度平面,即:完整的计算思路大家也可以去参考喵神的专栏。Shader完整代码:Shader "Custom/VertShadow" {Properties {...原创 2018-06-10 11:50:13 · 1370 阅读 · 0 评论 -
Shader笔记九 渲染路径&复杂光照
渲染路径&复杂光照渲染路径(Rendering Path)决定光照如何应用到UnityShader中。为了获取场景中的光源数据,需要为每个Pass指定其渲染路径。5.0以后的版本中,Unity支持前向渲染(Forward Renddering Path)和 延迟渲染(Deferred Rendering Path)。系统默认情况下选择的是前向渲染路径,可以更改,同时若想使用多个渲染路径,可...原创 2018-06-12 15:31:58 · 351 阅读 · 0 评论 -
Shader笔记十 Unity光照衰减&阴影
Unity中的光照衰减Unity在内部使用一张名为_LightTexture0的纹理来计算光源衰减,好处在于计算衰减不依赖于复杂的数学公式。fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL; 通常只会关心_LightTexture0对角线上的纹理颜色值,这些值表明了在...原创 2018-06-12 15:32:19 · 1884 阅读 · 0 评论 -
UnityShader RenderType&Queue 理解
在Unity Shader中会经常在SubShader中使用Tags,其中就会涉及RenderType和Queue,如:SubShader{ Tags{"RenderType"="Opaque" "Queue"="Geometry"} ...} RenderTypeRenderType通常使用的值包括:Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着...原创 2018-06-07 13:43:02 · 15320 阅读 · 2 评论