![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UnityShader入门精要笔记
包含知识点和代码解析
MeksQAQ
这个作者很懒,什么都没留下…
展开
-
UnityShader入门精要第十三章代码解析(全局雾效)
顶点着色器中定义uv坐标作为颜色输出,因为只有四个点,所以插值结果如下。屏幕效果,同一深度要处理的点就四个,其余的像素进行插值。雾效公式有好几种,看课本按需求选吧,这里用的线性的。原创 2023-04-12 02:20:08 · 315 阅读 · 0 评论 -
UnityShader入门精要第十三章代码解析(边缘检测)
基于深度法线纹理的边缘检测,使用卷积核Roberts,原理上是右下角的点的法线和深度值减去左上角的深度法线值,左下角的深度法线值减去右上角的深度法线值。这两句为啥要这样写。原创 2023-04-14 00:47:04 · 134 阅读 · 0 评论 -
UnityShader入门精要第十三章代码解析(深度纹理运动模糊)
再使用 在世界空间下的位置 * (前一帧的当前视角 * 投影矩阵) = 前一帧中的NDC顶点坐标。速度映射图存储了每个像素的速度,然后使用这个速度决定模糊的方向和大小。NDC下的顶点坐标 * (当前视角 * 投影矩阵的逆矩阵)= 在世界空间下的位置。用深度纹理在片元着色器中为每个像素计算其在世界空间下的位置。得到当前帧视角 * 投影矩阵的逆矩阵。原创 2023-04-09 01:20:40 · 117 阅读 · 0 评论 -
UnityShader入门精要第十三章(获取深度和法线纹理)
unity中获取深度纹理,先在脚本中设置摄像机的depthTextureMode,而后我们就可以通过在shader中声明CameraDepthTexture变量来访问它。Unity会使用着色器变换技术选择渲染类型为Opaque("RenderType" = "Opaque")的物体,判断他们渲染队列是否小于2500,如果满足条件,就把它渲染进深度纹理中。在正交投影、透视投影中我们会得到NDC(归一化的设备坐标),NDC的z轴范围是【-1,1】,映射到【0,1】中就能得到我们的深度图。原创 2023-04-08 18:13:52 · 390 阅读 · 0 评论 -
UnityShader入门精要第十二章(运动模糊效果)
accumulation buffer:物体快速移动产生多张连续图像,取他们平均值作为最后的运动模糊图像。实现运动模糊的方法:累计缓存和速度缓存。原创 2023-04-07 19:32:24 · 417 阅读 · 0 评论 -
UnityShader入门精要第十二章(Bloom效果)
pass【0】将高光部分提取出来传给buffer0,再将buffer0丢进去高斯模糊迭代,高斯模糊过程中不断使用pass【1】和pass【2】,把迭代之后的结果传给buffer0,然后buffer0传给纹理_Bloom。最后使用pass【3】,将_MainTex和_Bloom混合。实现原理:根据阙值提取出比较亮的区域,对该区域提取到一张纹理中并进行高斯模糊,最后进行混合。pass【3】将_Bloom和_MainTex混合。pass【1】【2】高斯模糊。pass【0】提取高光部分。原创 2023-04-07 18:31:44 · 194 阅读 · 0 评论 -
UnityShader入门精要第十二章(高斯模糊)
因为高斯模糊四方格的特殊性,可以简化成使用两个一维矩阵分别对行像素和列像素进行相乘,计算量为:行像素数 * 宽像素数 * 2 * 2,且效果一样。在高斯核维数不变的情况下,_BlurSize 越大,模糊程度越高 ,但。如果使用四方格对整个画面像素进行卷积,计算量为:行像素数 * 宽像素数 * 四方格5x5。,同时也能进一步提高模糊程度,但过大的 downSample 可能会使图像像素化。但过大的 _BlurSize 值会造成虚影,这可能并不是我们希望的。同时该一维矩阵中其实只有三个不同的元素。原创 2023-04-07 16:09:47 · 566 阅读 · 0 评论 -
UnityShader入门精要第十二章(颜色调整、边缘检测)
属性必须声明一个名为_MainTex的纹理属性,Graphics.Blit(src, dest, material)会将第一个参数传递给名为_MainTex的纹理属性。然后还要声明脚本中色彩调节三个的参数属性。OnRenderImage函数在所有不透明的Pass执行完后会立即被调用,会影响到后面透明的Pass渲染。在Unity中实现需要通过效果处理的脚本挂载在摄像机中,书中该脚本继承一个基类PostEffectBase。该脚本被希望在编辑器模式下也能正常使用,且规定只能挂载在Camera上。原创 2023-04-06 19:42:59 · 586 阅读 · 0 评论 -
UnityShader入门精要第十一章代码解析(顶点动画)
向上方向upDir取(0,1,0),当法线y值也为0时,也就是摄像机在物体正上方时,upDir改为(0,0,1)防止平行。frac(float2(0 , y) * _Time.y)取小数使偏移量在(0,1)之间。叉乘得到rightDir,rightDir和法线方向再叉乘得到真正的坐标系。顶点实际上是在A * sin(ax + y)上偏移。view - center使法线方向始终向着相机。构建出坐标系计算偏移后的顶点坐标再传出去。uv分量取值在(0,1)我也不知道为什么这么算。原创 2023-04-06 16:13:23 · 174 阅读 · 0 评论 -
UnityShader入门精要第十章代码解析(GrabPass玻璃材质)
【代码】UnityShader入门精要第十章代码解析(GrabPass玻璃材质)原创 2023-04-04 01:48:49 · 209 阅读 · 0 评论 -
UnityShader入门精要第十章代码解析(菲涅尔效果)
菲涅尔效果:光线照射到物体表面时,一部分光发生反射,一部分光进入物体内部发生折射或者散射。v是视角方向,n是法线,bias、scale、power是控制项。此处单纯混合了漫反射和反射。原创 2023-04-03 20:33:15 · 393 阅读 · 0 评论 -
UnityShader入门精要第十章代码解析(Cubemap折射)
【代码】UnityShader入门精要第十章代码解析(Cubemap折射)原创 2023-04-03 17:04:44 · 105 阅读 · 0 评论 -
UnityShader入门精要第十章代码解析(Cubemap反射)
/lerp(线性插值),当_ReflectionAmount取到 0 时diffuse为MainTex颜色,为1时则全反射。//reflect(出射方向,法线)计算出入射光线方向。//texCUBE(cubemap,入射光线方向)_ReflectionAmount 为0时。_ReflectionAmount 为1时。原创 2023-04-03 16:15:30 · 114 阅读 · 0 评论 -
UnityShader入门精要第九章代码解析(透明物体前向渲染)
FallBack "Transparent/VertexLit" 底下无阴影。FallBack "VertexLit"底下有阴影。原创 2023-04-03 13:11:34 · 80 阅读 · 0 评论 -
UnityShader入门精要第九章代码解析(不透明物体前向渲染)
UNITY_LIGHT_ATTENUATION 宏定义源码。原创 2023-04-03 09:43:24 · 123 阅读 · 0 评论 -
UnityShader入门精要 前向渲染路径和延迟渲染路径
之后,将每个光源以一个2D后期处理的方式(渲染屏幕大小的一个四边形)施加到最终图像上,这个过程使用的数据是在上一个批次中生成的G-buffer。前向渲染路径:完成一次完整的前向渲染,需要渲染这个对象的渲染图元,计算深度缓冲区和颜色缓冲区。每个逐像素光源都必须完成一次完整的上述渲染流程。一定数目的光源按逐像素处理(场景中最亮的平行光)(Important)(若数量小于Pixel Light Count,则有更多的光源按逐像素处理)前向渲染路径有3种处理光照的方式:逐顶点处理,逐像素处理,球谐函数处理。原创 2023-04-02 05:12:50 · 134 阅读 · 0 评论 -
unityshader入门精要8.4代码(透明度混合)
默认情况下渲染引擎剔除了物体背面的渲染图元,而只渲染了物体的正面。如果想要获得双面渲染的效果,可以使用Cull指令来控制需要剔除哪个面的渲染图元。先渲染背景,然后把半透明物体从后往前渲染,这里关闭了深度写入,颜色缓存区是写入的背景颜色,再将前面的颜色按混合因子和缓存区的颜色混合。两个pass中,一个Cull Front只渲染背面,一个Cull Back只渲染正面,按顺序执行pass。Unity中,使用Blend命令,设置混合状态同时开启了混合。把自身颜色和已经存在于颜色缓存区中的颜色值进行混合。原创 2023-04-01 02:57:11 · 145 阅读 · 0 评论 -
unityshader入门精要8.3代码(透明度测试)
大多数物体都应该使用该队列进行渲染,也是Unity Shader中默认的渲染队列。2.把半透明物体按照距离远近进行排序,按照从后往前的顺序渲染半透明物体,并开启深度测试,关闭深度写入(Transparent)Unity中的几种内置的渲染队列,按照渲染顺序,从先到后进行排序,队列数越小的,越先渲染,队列数越大的,越后渲染。Overlay (4000) 最后被渲染的物体的队列,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的。Background(1000) 最早被渲染的物体的队列。和以下的语句段意思一样。原创 2023-03-31 22:04:19 · 141 阅读 · 0 评论 -
unityshader入门精要7.4代码注释(遮罩)
【代码】unityshader入门精要7.4代码注释(遮罩)原创 2023-03-31 15:44:58 · 51 阅读 · 0 评论 -
unityshader入门精要7.3代码注释(Ramp)
主要是在halfLambert模型上采样那一句需要理解。配合上纹理贴图使用效果更明显。原创 2023-03-31 02:37:16 · 111 阅读 · 0 评论 -
unityshader入门精要7.2代码注释(世界空间下计算光照)
UnpackNormal一定要先将纹理设置成normal map类型。如果是高度图,则需要勾选Create from Grayscale。在世界空间坐标系下计算光照,用于需要Cubemap环境映射时。这里用float4存储多一个世界坐标系顶点位置,为了节省资源。Filtering中Smooth法线纹理更平滑 Sharp。顶点着色器中需要计算切线空间转换成世界空间的变换矩阵。Bumpiness用于控制凹凸程度。变换矩阵这里是线代的问题(头晕。原创 2023-03-31 01:26:17 · 90 阅读 · 0 评论 -
unityshader入门精要7.2代码注释(切线空间下光照计算)
和模型空间相比,切线空间可以重用法线纹理,一块砖头一张法线纹理可以用到六个面上。以顶点本身为原点,以该顶点的法线为z轴,以该点的切线为x轴,叉乘得到y轴。//uv.xy记载贴图纹理坐标,zw记录法线纹理坐标缩放。//法线纹理中存储的是法线经过映射之后得到的像素值。//和上一串代码中的不同,上一串用的自己的法线。//法线方向 = 像素值 * 2 - 1。//光照方向、视角方向变换到切线空间下。//纹理采样切线空间下的法线。//计算光照(切线空间下的)//顶点着色器要干些什么。//这里用的法线纹理。原创 2023-03-29 16:40:36 · 129 阅读 · 0 评论 -
unityshader入门精要7.1代码注释
不知道为什么照着书本敲的代码效果跟复制回来的代码相比总是暗了很多,找不同也找了好久没找到,直接在源码上做注释吧。原创 2023-03-25 03:04:27 · 123 阅读 · 0 评论 -
UnityShader入门精要第六章代码注释
光照模型笔记原创 2023-03-20 22:02:26 · 115 阅读 · 0 评论 -
unityshader入门精要第五章代码注释
如以下代码所示,这章主要知识点是熟悉shaderlab的格式。原创 2023-03-20 18:52:12 · 165 阅读 · 0 评论