简介考虑根据八方旅人分享的内容,做一个简单的游戏
内容
场景设计场景相关
后处理PostP
功能Function
性能优化及性能审核图形引擎实战:手游URP渲染管线升级 经验分享 - 搜狐畅游引擎部的文章 - 知乎
简介没想好
AOAO贴图SSAO计算一个球面所受到的光,但是实际上面所受到的光是半球面SSAO+HBAO计算多大面积可见,属于基于半球面的积分GTAO光从各个角度的结果不一样Ray-Tracing AO每帧每个像素发射一两根射线,在时序上进行数据的收集,完成球面采样的近似
雾效
抗锯齿
后处理常见的三种后处理
降低计算复杂度
渲染管线处理顺序,先阴影,再渲染物体,最后后处理
透明物体排序,由远及近,三个棍子重叠则根据中心点进行排序
移动端的Tile base rendering移动端存储芯片容易发热,使用TBR进行优化减少对 FrameBuffer 的读写
可以得到哪几个Tile被点光源照射到
FrameGraphUnitySRP的设计思想
V-Sync Technology防止画面割裂为了防止出现这种情况,在FrameBuffer全部写完后才计算下一帧
简介记录学习程序动画的记录
来源learn.unity.comDocs Animation RiggingProcedural Animation Video NotesMoveen tutorialyoutube
效果
你的浏览器不支持播放该视频
你的浏览器不支持播放该视频
类型Multi-Parent Constraint提供像父子对象的约束
Damped Transform阻尼变换约束允许阻尼从源游戏对象到受约束游戏对象的位置和旋转变换值。“保持目标”选项强制受约束对象始终瞄准源对象
ChainIK Constraint允许反转对游戏对象层次结构的控制,以便提供行为类似于链的操作。通过定义根和尖端游戏对象,链 IK 约束将能够找到并约束其间包含的所有游戏对象
TwistChain Constraint允许控制游戏对象链层次结构两端的世界旋转。根部和尖端旋转沿着链插值到游戏对象之间,以创建平滑的动画层次结构
Two Bone IK两个骨骼 IK 是一种约束,它将由 2 个骨骼组成的简单 FK 层次结构转换为可由目标游戏对象(类似手的控件)和提示游戏对象(类似肘的控件...
简介记录 Precomputed Radiance Transfer Global Illumination 的研究
预览
你的浏览器不支持播放该视频
来源预计算辐照度全局光照(PRTGI)从理论到实战 - AKG4e3的文章 - 知乎Unity移动端可用实时GI方案细节补充 - 方木君的文章 - 知乎10.3 球面函数和半球函数 - Justin的文章 - 知乎体探针漏光解决方案 - jackie 偶尔不帅的文章 - 知乎全局光照技术:从离线到实时渲染
思路
场景几何信息
探针获取 CubeMap,存储的数据过大,通过只存储指定数量的 Surfel 数据节省内存
实时光照计算
运行时计算每个 Surfel 受到的 radiance
为了计算屏幕像素得到光照,而不是单个 Surfel 的光照,需要将 Surfel 代表的环境光照信息编码到 Probe 上,像素着色时访问 Probe 得到其周围环境光照信息
光照信息编码
通过球谐函数和球谐系数和构成函数,可以得到给定方向上的光照颜色(对 radiance 进行编码)
根据 “当进行球面对称的核函数与原始信号函数的卷积...
简介记录常用的 Sprite Shader
Glow(发光)叠加自发光颜色
Outline(描边)
12345678910111213141516171819202122232425half spriteLeft = tex2D(_MainTex, i.uv + half2(destUv.x, 0)).a;half spriteRight = tex2D(_MainTex, i.uv - half2(destUv.x, 0)).a;half spriteBottom = tex2D(_MainTex, i.uv + half2(0, destUv.y)).a;half spriteTop = tex2D(_MainTex, i.uv - half2(0, destUv.y)).a;half result = spriteLeft + spriteRight + spriteBottom + spriteTop;#if OUTBASE8DIR_ONhalf spriteTopLeft = tex2D(_MainTex, i.uv + half2(destUv.x, destUv....
hybridclrhybridclrC#原生热更方案TEngine具体使用框架
热更流程InitResourcesUpdateVersion获取最新版本数据 PackageVersion(PackageManifest_DefaultPackage.version)文件保存最新版本(2023-10-14-1140)
UpdateManifest流程更新 Mainfest 清单
LoadCacheManifestOperation
GetSandboxPackageHashFilePath(获取沙盒内包裹的哈希文件路径)
比对本地 hash 文件的md5值 和 文件计算出的 md5 码是否一致
不一致则清除本地缓存文件
一致则加载 Manifest 文件,根据其中的内容,初始化 AssetBundle和Asset、Asset和GUID的关系
QueryBuildInPackageVersion
获取服务器上的 Version 文件
服务器上的 Hash 文件覆盖本地沙盒内的 Hash 文件
LoadBuildinManifestOperation
服务器上的 Manife...
简介客户端,相同的状态、相同的输入、相同的计算方式=相同的下一帧状态服务器,以固定间隔整理所有的客户端输入,整理成一个输入帧,通过网络传输给所有的客户端
需要实现的功能可靠的UDPKCPlinkKCP技术原理 - 韦斯特的文章 - 知乎
本质:ARQ协议(自动重发机制);
特性: 1: 超时计算 RTO(重传时间间隔)翻倍vs不翻倍,x1.5 2: 选择性重传vs全部重传 3: 快速重传:发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用等超时,直接重传2号包,大大改善了丢包时的传输速度。 延迟ackvs非延迟ack:TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。
使用原理:以一个消息的收发为例: ® 使用socket接口搭建udp底层通信,例如...
简介记录研究 Text Animator 插件的实现Text Animator
Text的区别TextMesh 是将每个字符都作为一个Mesh进行渲染显示,相对于原先 Text 将整体划分为一个 Mesh,可拓展性更高
字体的显示123456789101112131415Shader "TextMeshPro/Bitmap" { Properties { _MainTex ("Font Atlas", 2D) = "white" {} _FaceTex ("Font Texture", 2D) = "white" {} _FaceColor ("Text Color", Color) = (1,1,1,1) } fixed4 frag (v2f IN) : SV_Target { fixed4 col...
简介开始尝试做开放世界游戏,记录用的插件和要考虑的东西
地形切割world-streamer-2
提供对于Unity Terrain组件进行切割,并生成多级Low网格
在设定区域内使用Terrain,区域外则使用Mesh渲染处理后的Low网格
地形会切割成多个场景,提供场景流式加载
场景的异步加载 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849IEnumerator LoadAsync(){ // yield return new WaitForSeconds(0.5f); //Debug.Log("scenesToLoad " + scenesToLoad.Count); int[] sceneLoadIndexes = new int[scenesToLoad.Count]; for (int i = 0; i < scenesToLoad.Count; i++) ...
简介刚买了ps5,试试在Unity中的支持
链接Unity-Technologies/InputSystemDualSenseGamepadHIDInputSystemSony DeveloperSDKGithub
常用接口前置准备
1234567DualSenseGamepadHID pad;private void Awake(){ pad = (DualSenseGamepadHID)Gamepad.current; // pad.OnStateEvent}
注意Dualshock 4 上的功能SetMotorSpeeds(Single, Single)是使用 IOCTL 命令实现的,因此如果快速连续调用任一方法,很可能只有第一个命令会成功完成。其他命令将被删除。如果需要同时设置灯条颜色和隆隆声电机速度,请使用该SetMotorSpeedsAndLightBarColor(Single, Single, Color)方法
设置颜色12pad.SetLightBarColor(gamePadColor);
设置震动12345678...