- 博客(30)
- 收藏
- 关注
原创 百人计划图形篇3.1笔记(深度测试、XRay效果)
透明XRay效果深度测试ZTest为Greater,关闭深度写入。渲染时不透明物体从前往后渲染,先渲染长条带,写入深度。渲染胶囊体时先渲染第一个Pass,第一个Pass的ZTest为Greater,当前深度缓存深度小于胶囊体深度,深度测试通过,渲染透明XRay效果。第二个Pass的ZTest为默认LEqual,在未被遮挡部分,当前深度缓存为无穷大,深度测试通过,被遮挡部分深度缓冲为透明带深度,深度缓存小于胶囊体深度,测试不通过。胶囊体中含有两个Pass,一个是透明的XRay效果,一个是正常渲染效果。
2023-04-28 22:43:26
206
原创 roystan的卡通水体渲染笔记
通过获取unity相机中深度法线图,获取水底和水中物体的法线,再获取水面的视空间法线,两者点积,当点积较大时(没有物体)使用较大的泡沫阙值;案例中水体设置成ZWrite Off,不写入深度,通过unity相机的深度图计算出水底的深度,再通过齐次坐标的w分量获得水面的深度。所以顶点齐次坐标w值为-z。泡沫效果是直接采用噪音贴图采样,然后设置阙值,对噪音贴图进行二进制效果转换让噪音贴图变得干净,然后根据深度截止边缘处的阙值。江陵野少这里对齐次坐标的概念和为什么用齐次坐标的w分量作为顶点的深度进行了解释。
2023-04-27 19:18:54
262
原创 百人计划图形篇2.5笔记(视差贴图)
光照的计算需要在切线空间下计算。先将法线、切线传到顶点着色器中,叉乘计算出副切线。float3x3(切线、副切线、法线)构成世界空间转切线空间转换矩阵。将法线纹理中解包UnpackNormal,参与计算。靠近了之后效果会变得很差。
2023-04-21 01:56:14
112
原创 百人计划图形篇2.7笔记(Gamma)
通过点击菜单Edit->Project Settings->Player页签->Other Settings下的Rendering部分进行修改,参数Color Space可以选择Gamma或Linear。使用硬件特性完成sRGB贴图的线性采样和shader计算结果的gamma校正,比起在shader里对贴图采样和计算结果的校正要快。所有工作都在线性空间下进行,计算得到正确的结果输出给显示器时再转换为非线性空间。不在线性空间下处理会导致亮度叠加,颜色混合时结果计算错误。
2023-04-20 06:37:39
94
原创 UnityShader入门精要第十三章代码解析(边缘检测)
基于深度法线纹理的边缘检测,使用卷积核Roberts,原理上是右下角的点的法线和深度值减去左上角的深度法线值,左下角的深度法线值减去右上角的深度法线值。这两句为啥要这样写。
2023-04-14 00:47:04
178
原创 UnityShader入门精要第十三章代码解析(全局雾效)
顶点着色器中定义uv坐标作为颜色输出,因为只有四个点,所以插值结果如下。屏幕效果,同一深度要处理的点就四个,其余的像素进行插值。雾效公式有好几种,看课本按需求选吧,这里用的线性的。
2023-04-12 02:20:08
455
原创 UnityShader入门精要第十三章代码解析(深度纹理运动模糊)
再使用 在世界空间下的位置 * (前一帧的当前视角 * 投影矩阵) = 前一帧中的NDC顶点坐标。速度映射图存储了每个像素的速度,然后使用这个速度决定模糊的方向和大小。NDC下的顶点坐标 * (当前视角 * 投影矩阵的逆矩阵)= 在世界空间下的位置。用深度纹理在片元着色器中为每个像素计算其在世界空间下的位置。得到当前帧视角 * 投影矩阵的逆矩阵。
2023-04-09 01:20:40
156
原创 UnityShader入门精要第十三章(获取深度和法线纹理)
unity中获取深度纹理,先在脚本中设置摄像机的depthTextureMode,而后我们就可以通过在shader中声明CameraDepthTexture变量来访问它。Unity会使用着色器变换技术选择渲染类型为Opaque("RenderType" = "Opaque")的物体,判断他们渲染队列是否小于2500,如果满足条件,就把它渲染进深度纹理中。在正交投影、透视投影中我们会得到NDC(归一化的设备坐标),NDC的z轴范围是【-1,1】,映射到【0,1】中就能得到我们的深度图。
2023-04-08 18:13:52
476
原创 UnityShader入门精要第十二章(运动模糊效果)
accumulation buffer:物体快速移动产生多张连续图像,取他们平均值作为最后的运动模糊图像。实现运动模糊的方法:累计缓存和速度缓存。
2023-04-07 19:32:24
527
原创 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
241
原创 UnityShader入门精要第十二章(高斯模糊)
因为高斯模糊四方格的特殊性,可以简化成使用两个一维矩阵分别对行像素和列像素进行相乘,计算量为:行像素数 * 宽像素数 * 2 * 2,且效果一样。在高斯核维数不变的情况下,_BlurSize 越大,模糊程度越高 ,但。如果使用四方格对整个画面像素进行卷积,计算量为:行像素数 * 宽像素数 * 四方格5x5。,同时也能进一步提高模糊程度,但过大的 downSample 可能会使图像像素化。但过大的 _BlurSize 值会造成虚影,这可能并不是我们希望的。同时该一维矩阵中其实只有三个不同的元素。
2023-04-07 16:09:47
662
原创 UnityShader入门精要第十二章(颜色调整、边缘检测)
属性必须声明一个名为_MainTex的纹理属性,Graphics.Blit(src, dest, material)会将第一个参数传递给名为_MainTex的纹理属性。然后还要声明脚本中色彩调节三个的参数属性。OnRenderImage函数在所有不透明的Pass执行完后会立即被调用,会影响到后面透明的Pass渲染。在Unity中实现需要通过效果处理的脚本挂载在摄像机中,书中该脚本继承一个基类PostEffectBase。该脚本被希望在编辑器模式下也能正常使用,且规定只能挂载在Camera上。
2023-04-06 19:42:59
738
原创 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
234
原创 UnityShader入门精要第十章代码解析(GrabPass玻璃材质)
【代码】UnityShader入门精要第十章代码解析(GrabPass玻璃材质)
2023-04-04 01:48:49
262
原创 UnityShader入门精要第十章代码解析(菲涅尔效果)
菲涅尔效果:光线照射到物体表面时,一部分光发生反射,一部分光进入物体内部发生折射或者散射。v是视角方向,n是法线,bias、scale、power是控制项。此处单纯混合了漫反射和反射。
2023-04-03 20:33:15
480
原创 UnityShader入门精要第十章代码解析(Cubemap反射)
/lerp(线性插值),当_ReflectionAmount取到 0 时diffuse为MainTex颜色,为1时则全反射。//reflect(出射方向,法线)计算出入射光线方向。//texCUBE(cubemap,入射光线方向)_ReflectionAmount 为0时。_ReflectionAmount 为1时。
2023-04-03 16:15:30
161
原创 UnityShader入门精要第九章代码解析(透明物体前向渲染)
FallBack "Transparent/VertexLit" 底下无阴影。FallBack "VertexLit"底下有阴影。
2023-04-03 13:11:34
138
原创 UnityShader入门精要 前向渲染路径和延迟渲染路径
之后,将每个光源以一个2D后期处理的方式(渲染屏幕大小的一个四边形)施加到最终图像上,这个过程使用的数据是在上一个批次中生成的G-buffer。前向渲染路径:完成一次完整的前向渲染,需要渲染这个对象的渲染图元,计算深度缓冲区和颜色缓冲区。每个逐像素光源都必须完成一次完整的上述渲染流程。一定数目的光源按逐像素处理(场景中最亮的平行光)(Important)(若数量小于Pixel Light Count,则有更多的光源按逐像素处理)前向渲染路径有3种处理光照的方式:逐顶点处理,逐像素处理,球谐函数处理。
2023-04-02 05:12:50
193
原创 unityshader入门精要8.4代码(透明度混合)
默认情况下渲染引擎剔除了物体背面的渲染图元,而只渲染了物体的正面。如果想要获得双面渲染的效果,可以使用Cull指令来控制需要剔除哪个面的渲染图元。先渲染背景,然后把半透明物体从后往前渲染,这里关闭了深度写入,颜色缓存区是写入的背景颜色,再将前面的颜色按混合因子和缓存区的颜色混合。两个pass中,一个Cull Front只渲染背面,一个Cull Back只渲染正面,按顺序执行pass。Unity中,使用Blend命令,设置混合状态同时开启了混合。把自身颜色和已经存在于颜色缓存区中的颜色值进行混合。
2023-04-01 02:57:11
199
原创 unityshader入门精要8.3代码(透明度测试)
大多数物体都应该使用该队列进行渲染,也是Unity Shader中默认的渲染队列。2.把半透明物体按照距离远近进行排序,按照从后往前的顺序渲染半透明物体,并开启深度测试,关闭深度写入(Transparent)Unity中的几种内置的渲染队列,按照渲染顺序,从先到后进行排序,队列数越小的,越先渲染,队列数越大的,越后渲染。Overlay (4000) 最后被渲染的物体的队列,一般是覆盖效果,比如镜头光晕,屏幕贴片之类的。Background(1000) 最早被渲染的物体的队列。和以下的语句段意思一样。
2023-03-31 22:04:19
185
原创 unityshader入门精要7.2代码注释(世界空间下计算光照)
UnpackNormal一定要先将纹理设置成normal map类型。如果是高度图,则需要勾选Create from Grayscale。在世界空间坐标系下计算光照,用于需要Cubemap环境映射时。这里用float4存储多一个世界坐标系顶点位置,为了节省资源。Filtering中Smooth法线纹理更平滑 Sharp。顶点着色器中需要计算切线空间转换成世界空间的变换矩阵。Bumpiness用于控制凹凸程度。变换矩阵这里是线代的问题(头晕。
2023-03-31 01:26:17
122
原创 unityshader入门精要7.2代码注释(切线空间下光照计算)
和模型空间相比,切线空间可以重用法线纹理,一块砖头一张法线纹理可以用到六个面上。以顶点本身为原点,以该顶点的法线为z轴,以该点的切线为x轴,叉乘得到y轴。//uv.xy记载贴图纹理坐标,zw记录法线纹理坐标缩放。//法线纹理中存储的是法线经过映射之后得到的像素值。//和上一串代码中的不同,上一串用的自己的法线。//法线方向 = 像素值 * 2 - 1。//光照方向、视角方向变换到切线空间下。//纹理采样切线空间下的法线。//计算光照(切线空间下的)//顶点着色器要干些什么。//这里用的法线纹理。
2023-03-29 16:40:36
175
原创 unityshader入门精要7.1代码注释
不知道为什么照着书本敲的代码效果跟复制回来的代码相比总是暗了很多,找不同也找了好久没找到,直接在源码上做注释吧。
2023-03-25 03:04:27
161
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人