2.1k words
简介客户端,相同的状态、相同的输入、相同的计算方式=相同的下一帧状态服务器,以固定间隔整理所有的客户端输入,整理成一个输入帧,通过网络传输给所有的客户端 需要实现的功能可靠的UDPKCP数据的同步客户端向服务器 在非回放的状态下,Update中,将当前的输入(horizontal、vertical、fire1、mouseDown、useSkill)保存到静态变量(GameManager.CurGameInput)中 GameManager 中 Update 调用 SendInput ,将当前帧和 curGameInput 发送给服务器 接收到服务器发送来的数据,GameManager.PushFrameInput(msg.input) ,将帧和操作数据存入本地(frame 中) Update 中,根据 frame 中拿到当前帧的操作,并赋予给 inputAgent ,inputAgent 根据 数据进行位置的移动、角度的旋转 服务器向客户端 接受客户端发送来的数据,并在等待间隔后,转发给其他客户端 确定性的数学、物理运算库存在的问题 十进制浮点数无法精准转换为二进制...
6.9k words
简介记录研究 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...
4.1k words
简介开始尝试做开放世界游戏,记录用的插件和要考虑的东西 地形切割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++) ...
14k words
简介刚买了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...

IBR

7.7k words
简介关于游戏开发中基于图像的渲染(Image-Based Rendering,简称IBR)技术的方方面面,将总结《RTR3》书中第十章提到的16种常用的IBR渲染技术 渲染谱 The Rendering Spectrum 固定视角的渲染 Fixed-View Rendering 天空盒 Skyboxes 光场渲染 Light Field Rendering 精灵与层 Sprites and Layers 公告板 Billboarding 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105//ScriptableRenderer.csprivate static void CalculateBillboard...
2.2k words
简介细节层次(Level of Detail,LOD)的基本思想是当物体对渲染出图像贡献越少,使用越简单的形式来表达该物体。这是一个已经在各种游戏中广泛使用的基本优化技术 链接Github 浅墨 游戏开发中的渲染加速算法总结19.9 细节层次(LOD) - Justin的文章 - 知乎 过程 生成 生成不同细节的模型表示 选择 基于某种准则选取一个层次细节模型,比如屏幕上的评估面积 切换 从一个细节层次转换到另一个细节层次的过程 LOD切换技术 Discrete Geometry LODs(离散几何 LOD) 离散几何LOD是最简单的LOD算法,不同的表示是不同图元数量的同一模型,但这种方法突越现象严重 离散几何LOD是一种LOD算法,即层次细节模型,是一种实时三维计算机图形技术,可以根据物体对渲染出图像的贡献程度,选择不同数量的几何体来表达该物体 这种算法非常适合现代图形硬件,因为这些单独的静态网格可以存储在GPU内存中并重用 但是,这种算法也有一个缺点,就是当从一个LOD切换到另一个LOD的时候,会产生突跃现象,即模型的忽然替换会引起观察者的注意 Blend...
2.9k words
简介记录常用的剔除技术 链接AssetStore一篇文章彻底弄懂齐次裁剪 - Clawko的文章 - 知乎 齐次空间下的裁剪CSDNGithub 浅墨 游戏开发中的渲染加速算法总结 背面裁剪背面裁剪是一种渲染性能优化的技术,它是将背向视点的物体或多边形删除,避免进行不必要的光栅化和深度测试。背面裁剪可以根据多边形的法向量或顶点的索引顺序来判断是否背向视点。背面裁剪是一种非常简单直观的操作,只能一次一对个单一多边形进行操作。 一般在光栅化阶段进行,在顶点着色器输出的顶点转换为片元的过程中,根据三角形的顶点顺序和法向量来判断哪些片元是背面,然后丢弃他们,减少片元着色器的工作量 根据三角形的三个顶点计算法向量,摄像机和三角形任意顶点的向量,点乘结果正负判断正面背面 视锥裁剪利用空间数据结构,可以分层地来应用这种裁剪。例如,对于层次包围体BVH来说,从根节点进行先序遍历(Preorder Transversal),就可以完成这一任务 除了层次包围体,其他的空间数据结构同样也可以用于视锥裁剪,包括上文提到的八叉树和BSP树。但是当渲染动态场景时,这些方法便会显得不够灵活,不如层次包围体 ...
5k words
简介记录从GDC2023里学的东西 车漆效果GDC2023干货分享 90帧高质量写实手游的程序实现与美术设计 - 网易游学的文章 - 知乎 王牌竞技中的汽车涂层使用了双层BRDF和双层法向量 双层BRDF可以分为两个部分:表面层和基底层,每个部分都有自己的BRDF函数。表面层通常是一个镜面反射,基底层通常是一个漫反射。两个层之间有一个菲涅尔项来计算光线在表面层和基底层之间的反射和透射比例,网易提供的图片中,正中位置也存在着对于周边环境的反射结果,或许是通过 Lerp(base,base+surface,value) 插值的方式控制 Bing大小姐提供的伪代码 123456789101112131415161718192021222324252627# 定义表面层的BRDF函数,这里假设是一个Cook-Torrance模型def surface_brdf(L, V, N, H): # 计算菲涅尔项,这里假设是一个Schlick近似 F = surface_fresnel + (1 - surface_fresnel) * (1 - dot(V, H)) ** 5 ...
3.3k words
分块管理(空间数据结构上的优化)在考虑大场景的情况下,可能存在几百万乃至更多的草,如果每帧都去进行可见性剔除,开销过大。所以选择使用空间加速算法来优化,通过划分多个AABB,根据AABB是否与摄像机裁剪区域相交、包含,再进行具体草的剔除 图形引擎实战:一种大世界巨量植被管理与渲染方案 - 搜狐畅游引擎部的文章 - 知乎 CPU裁剪对于草的数据构建一个BVH树,使用AABB包围指定数量的草,通过判断AABB是否与摄像机区域交相、包含,决定是否传递数据给GPUUnityURP-MobileDrawMeshInstancedIndirectExample 作者AABB裁剪的思想 1234567891011121314for (int i = 0; i < cellPosWSsList.Length; i++){ //create cell bound Vector3 centerPosWS = new Vector3 (i % cellCountX + 0.5f, 0, i / cellCountX + 0.5f); centerPosWS.x = M...
3.2k words
简介Gran Turismo色调映射是一种颜色变换技术,通过改变HSV色彩空间的色调H值并采样色调映射纹理来产生平滑的颜色变化,将颜色从HDR转为LDR 实现步骤 Shader中将输入的RGB颜色空间转换到HSV颜色空间 改变HSV空间的色调H值,可以通过时间或其他参数进行变化。色调H值的变化范围是0到1 根据变化的色调H值采样色调映射纹理,得到新的RGB颜色 将原始RGB颜色和新的RGB颜色进行线性插值,得到最终输出颜色。插值因子由外部设定,控制颜色变换的强度 1234567891011121314float4 Frag(Varyings input) : SV_Target{ // Lut space // We use Alexa LogC (El 1000) to store the LUT as it provides a good enough range // (~58.85666) and is good enough to be stored in fp16 without losing precision in the //...