- 博客(58)
- 收藏
- 关注
原创 URP - 水效果Shader
水下焦散的效果实现和之前学习的深度贴花的实现方法相同,需要利用面片在视图空间下的坐标值求出当前深度图中的像素在视图空间下的坐标值,再将此坐标值转换到世界空间下,用此坐标值作为UV来采样焦散纹理。然后可以利用扭曲后的屏幕UV采样深度图,通过深度差来判断深度图中的物体是出于水面上还是水面下,若空间中的物体处于水面上,则采样屏幕纹理时的坐标使用水体面片的屏幕空间坐标。//使纹理的重复和平铺有效。首先定义一个用于扭曲水下的纹理,采样此纹理,利用此纹理来改变屏幕UV,用扭曲后的屏幕UV来采样屏幕纹理。
2025-06-02 21:33:51
887
原创 URP - 深度贴花效果实现
其实我也没有太理解这种方法的具体原理,只清楚了些大概,这种方法应该是基于世界空间的深度贴花,使用AI查了一下大概的实现原理。但是我有个疑惑,为什么这样做出来的效果不是很对呢?在贴花移动到摄像机的远处时,贴花的半个部分就不显示了是为什么?//将深度图中的像素在视图空间下的坐标值转换到世界空间下。//XY方向的值根据贴花模型与场景中物体的透视关系求出。//将模型顶点的本地空间坐标转换为世界空间下的坐标。//将模型顶点的世界空间坐标转换为视图空间下的坐标。//Z值为深度图在视图空间下的值。
2025-05-12 11:39:50
612
原创 URP - 能量罩实现
所以可以使用深度图中的深度信息减去球体本身的深度信息,这样被球体遮挡的部分的值在0-1的范围内,而交接处的值大约为0 (而球体本身的深度值为负值,所以可以通过两者相加计算)因为越靠近摄像机的位置深度值越小,所以在有物体与能量罩球体接触到时,被球体遮挡的部分深度值大于该位置球体本身的深度值,而交接处两者的深度值差不多一样。//i.positionVS.z为负值,所以要用两者相加,在立方体被遮挡的区域此时depth的深度值大于此区域上模型本身的深度值。//将世界空间的模型顶点转换到视图空间(观察空间)
2025-05-11 11:48:16
693
原创 URP - 屏幕图像(_CameraOpaqueTexture)
若想要该对象不被渲染到屏幕图像中,可以将其Shader的渲染队列改为 "Queue" = "Transparent"使用模型的屏幕空间坐标采样屏幕图像的具体方法看前一篇。
2025-05-06 18:03:16
309
原创 URP - 深度图
/i.positionCS/_ScreenParams.xy的作用就是将模型的坐标转换到屏幕坐标系下并映射到0-1的范围内。//i.positionCS为屏幕映射后的值(也就是屏幕空间下的坐标),_ScreenParams.xy分别代表屏幕的宽高。//因为深度是一个非线性的值域,所以需要将此深度图转换到一个线性的空间(并将值映射到0-1的范围内)//此时uv代表模型在屏幕空间下的坐标值,用此值来采样深度图(此时为非线性的深度图)
2025-05-06 17:49:16
453
原创 URP - 公告牌的效果实现
可以假设Z方向向量为从模型指向摄像机,将摄像机的世界坐标系下的坐标值转换到模型空间再归一化就得到了旋转后的坐标系的基向量在原本地坐标系下的Z方向的基向量。根据上面顶点旋转的原理我们来看一下如何让面片的顶点跟随摄像机进行旋转,求得旋转后的面片顶点的坐标值。通过左手定则,大拇指指向要求的x轴,叉乘时食指代表的数值在前,中指代表的数值在后。所以旋转后顶点的坐标值是由旋转后的基向量在原坐标系下的值乘以原顶点坐标。而模型跟随摄像机旋转后的坐标系的基向量在原本地坐标系下的值如何得到呢?
2025-04-30 20:11:05
389
原创 URP-UGUI交互功能实现
(1)首先创建一个Rotate脚本,拖动到用于旋转的对象上,在Rotate脚本中的Upadate方法中添 加this.transform.Rotate(Vector3.up,(5)或者可以直接在Update()方法中添加 obj.GetComponent<RotatePractice>().speed = slider.value;(2)然后创建一个脚本,拖动到Canvas上,用于控制UGUI中的滑动条和按钮的行为。:在OnClick()中添加动态的SetActive方法。
2025-04-23 21:31:53
1088
原创 URP-UGUI相关知识
(1)Screen Space - Overlay :表示画布上的内容在最上层绘制。(3)World Space : 此时画布以及画布中的内容为片状的3D对象。(2)Screen Space - Camera : 指定摄像机渲染。
2025-04-23 19:48:20
847
原创 URP-纹理和采样器
/ 定义_MainTex纹理TEXTURE2D(_MainTex);如果是GLES2.0平台则相当于sampler2D _MainTex;否则相当于Texture2D _MainTex;// 定义采样器SAMPLER同时可设置采样器的过滤模式和重铺模式(预定义的形式)单独定义纹理U和V方向的重铺参数把纹理和采样器分离定义后,在运行时能够方便地更换纹理,而无需改变采样器的设置。比.如在游戏中,角色的皮肤纹理可以在不同场景或者状态下进行切换,而采样器的过滤模式、寻址模式等设置保持不变。
2025-04-17 16:43:16
963
原创 URP-常量缓冲区
每个物体的渲染都需要 CPU 向 GPU 发送一系列的渲染指令,这些指令包括设置材质、顶点数据、变换矩阵等。频繁的指令发送会导致 CPU 与 GPU 之间的通信开销增加,从而影响渲染性能。SRP 合批就是将多个物体的渲染指令合并为一个或少数几个,减少 CPU 与 GPU 之间的通信次数,从而提高渲染效率。它是在可编程渲染管线的框架下实现的,开发者可以通过编写自定义的渲染脚本,对合批过程进行更精细的控制。借助常量缓冲区,能够避免在每次渲染调用时都传递相同的数据,从而提高渲染效率。
2025-04-17 11:06:26
284
原创 URP渲染管线
Unity 的渲染管线包括(内置渲染管线)和 (SRP),内置渲染管线是 Unity 默认的渲染管线,它有固定的渲染流程,自定义选项有限,开发者难以对其渲染流程进行深度修改。其中URP(通用渲染管线)和 HDRP(高清渲染管线)是基于 SRP 构建的具体实现,属于 SRP 体系。其中SRP是由(URP通用渲染管线)和(HDRP高清渲染管线)组成,SRP是可脚本化渲染管线,是 Unity 引擎中一种可定制的渲染系统,它允许开发者通过编写脚本来自定义渲染流程,以满足不同项目的特定渲染需求。
2025-03-27 11:31:02
892
原创 利用脚本和Shader制作屏幕后处理效果
Unity会把当前渲染完成后的图像存储在src源渲染纹理中,通过函数中的一系列操作后(该函数内操作是我们自定义的),再把目标渲染纹理存储在dest渲染纹理中,dest最终会被显示到屏幕上
2025-03-26 23:06:32
685
原创 屏幕后处理Post-Processing安装及使用
该效果会动态调整图像的曝光以匹配其中间色调,用以模拟人眼实时调整亮度的变化。该效果会使物体在运动方向产生模糊,用以模拟现实中相机光圈打开情况下移动或捕捉移动速度快于相机曝光时间的物体时产生的模糊效果。该效果会分离图像的红绿蓝通道,用以模拟现实世界中相机在光线折射产生的不同波长光分离的效果。该效果会使图像产生畸变 (枕形/桶形),用以模拟真实世界相机镜头的形状引起的失真。该效果会模糊图像的背景,用以模拟真实世界相机镜头的焦距特性,产生对焦效果。屏幕录制 2025-03-25 174138。
2025-03-25 18:01:47
951
原创 合批Batching
静态合批实际上是引擎在打包或者烘焙时候,将同材质的物体合并成一个更大的物体,这样相同材质的物体只需要一次渲染状态设置和一次DrawCall调用,也就一个批次。由于合并生成大的模型后,会占用额外的内存空间,比如三个同材质的立方体的网格就是一个简单的立方体,合并后的网格占用是三个世界空间立方体的组合,因此有时候需要考虑静态合批带来的内存增长。批处理指的是将多个DrawCall合并为一个DrawCall,可以让CPU将满足条件的多个对象的渲染组合到一个内存块中以便减少由于资源切换而导致的 CPU 开销。
2025-03-20 11:46:17
842
原创 通过C#脚本更改材质球的参数
协程是通过迭代器来实现功能的,通过关键字IEnumerator来定义一个迭代方法,注意使用的是IEnumerator
2025-03-19 21:20:54
861
原创 Shader的编译目标渲染器(/平台)
一份游戏在最终打包时,其中的每一个Shader会根据最终显示的平台的不同编译为不同版本的Shader代码。好处:可明确的指定该Shader所支持的平台,编译的时间和内存会相对减少。例如手机平台,PC端等等,Shader会根据不同平台编译出不同的代码。坏处:在某些平台是不会正常显示所写的Shader的。1.排除掉某些目标渲染器。2.只保留某些目标渲染器。
2025-03-11 18:48:07
197
原创 Shader的一些优化规则
默认为 Tags { DisableBatching = "false" } //表示默认需要合批。当不需要进行合批时,在Shader中添加 Tags{ DisableBatching = "True" }例: [NoScaleOffset]_MainTex("MainTex",2D)="white"{}//每个使用此Shader的对象在每帧内都会GrabPass一次。//所有使用该Shader的对象在一帧内只GrabPass一次。当没有勾选时:(所有变体会组合爆炸)
2025-03-11 18:06:47
294
原创 碰撞体组件、刚体组件
例如Sphere为UI层对象,Cube为Water层对象;设置Cube碰撞体中的层级重写后的优先级为1且其包含UI层;设置Sphere碰撞体中的排除Water层;当两个层级的对象发生碰撞时,会根据碰撞体组件中两对象的层级重写的优先级来决定碰撞情况。
2025-02-24 16:48:33
317
原创 Unity摄像机与灯光相关知识
如果你想绘制一个玩家的枪而不让它在环境内部得到裁剪,你要设置一个深度为0的相机来绘制环境,还要另一个深度为1的相机单独绘制武器。当你使用多个相机时,每一个都将自己的颜色和深度信息存储在缓冲区中,还将积累大量的每个相机的渲染数据。注意:只能给深度数值最大的摄像机设置 Depth Only,这样两个摄像机的画面才会都显示在 Game视口中,而当两个摄像机深度数值相同,则都可以。摄像机的深度,当有多个摄像机时,深度的大小影响摄像机的渲染次序。屏幕上的任何空的部分将显示当前相机的背景颜色。
2025-02-21 21:16:23
1038
原创 PBR光照模型相关知识
因为只要半角向量和微表面法线越接近,反射光线就有可能进入观察者的视线,并且越接近,反射光线进入视线的概率和强度就越大。surfaceReduction 通常与物体表面的粗糙度相关,粗糙度越高,表面的微表面结构越复杂,反射光越分散,surfaceReduction 的值可能越小;可以发现当夹角为0时,即入射光垂直于表面,反射光的比例只有4%左右,而当夹角为90度时,即入射光平行于表面,反射比例将近100%,符合我们前面所说的菲涅尔效应。相反当入射光线与法线的夹角越大,反射的光线越多,折射的光线越少。
2025-02-18 23:30:03
770
原创 前部分知识复习04
如图三,因为当前一个Pass打开深度写入后,深度缓冲中的默认值为该模型最前面像素的深度值(也就是离摄像机最近的模型像素的深度值),在当渲染下一个Pass时,当条件为Greater(大于)通过测试时,这时只会渲染比离摄像机最近模型的深度值还大的地方,所以就等会出现如图三所式的情况。图五,深度测试为小于等于时,离摄像机最近的模型像素的深度值等于当前深度缓冲中的深度值,通过测试,但是后面的模型像素的深度值大于当前深度缓冲中的深度值,测试不通过,这样就解决了半透明模型渲染出背面的问题。//代表写入最前面的深度。
2025-02-06 00:31:50
589
原创 前部分知识复习01
multi_compile定义的宏,如#pragma multi_compile_fog,#pragma multi_compile_fwdbase等,基本上适用于大部分shader,与shader自身所带的属性无关。ReadMask的值将和Ref的值以及模板缓冲中的值进行按位与(&)操作,取值范围也是0-255的整数,默认值为255(二进制位11111111),即读取的时候不对Ref的值和模板缓冲中的值产生修改,读取的还是原始值.x的范围为(0,1);当x为0-1之间的值时,函数取a,b之间的插值。
2025-01-26 20:10:37
1107
原创 【无标题】
不过计算机组成原理真难,考试最后一道大题不会做……后续放假回家后再更新学习动态吧!终于考完了,已经在回家的路上了……这段时间在忙期末考试。
2025-01-14 17:56:15
98
原创 Gamma、Linear、sRGB和伽马校正概念理解
而计算机图形学是物理世界视觉的数学模型,Shader中颜色插值、光照的计算自然也是在线性空间描述的。美术输出的贴图等资源都是在sRGB空间的(即本身颜色就被Gamma校正过),但Normal Map等其他电脑计算出来的纹理则一般在线性空间。同时显示器中输出的颜色值在Gamma2.2空间,所以在此基础上人眼看到的颜色值会比显示器中输出的颜色值更暗。这样导致了画面的不真实。所以在进行Shader计算前需移除颜色Gamma校正,将颜色值转换到线性空间中,再进行Shader中的颜色插值以及光照等的计算。
2024-12-23 19:26:24
484
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人