Desc:记录法线贴图的变更
法线映射非移动平台上,Unity会把法线贴图转换成 DXRT5nm 格式,只有两个有效通道 GA ,节省空间的优化移动平台上,RGB 通道
123456789101112131415161718fixed3 UnpackNormalmapRGorAG(fixed4 packednormal){ // This do the trick packednormal.x *= packednormal.w; fixed3 normal; normal.xy = packednormal.xy * 2 - 1; normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy))); return normal;}inline fixed3 UnpackNormal(fixed4 packednormal){#if defined(UNITY_NO_DXT5nm) return packednormal.xyz * 2 - 1;#else r...
Desc:Manifest储存着所有AB和AB之间的依赖关系
AssetsPathMapping包含着资源路径到AB的路径映射
1234567891011121314public class ResourcesMapItem{ public string assetbundleName; public string assetName;}//资源路径对应mapItemprotected Dictionary<string, ResourcesMapItem> pathLookup = new Dictionary<string, ResourcesMapItem>();//ab包对应的资源protected Dictionary<string, List<string>> assetsLookup = new Dictionary<string, List<string>>();//资源对应的ab包protected Dictionary<string, string&g...
Desc:用于减少场景中物体的数量
原理将地图分为存在上限的树,树每个非根节点可以最大存在四个子节点,物体如果存在两个及以上区域的时候,挂载在上一层节点上
实现接口INode.cs:Bounds bound{get;set;}// 初始化节点void InsertNodeData(NodeData data);// 在视角内,检查当前节点是否在摄像机裁剪区域内,不在则调用 Outside 回收void Inside(Camera camera);// 不在视角void Outside(Camera camera);// 编辑器模式下进行绘制void DrawBound();
类Node.cs:实现INode接口,定义深度和子节点
Tree.cs:定义最大层数
NodeData.cs:存储每个节点的数据,通过编辑器初始化
NodeManager.cs:持有当前场景中所有节点的引用,控制节点的加载和释放
QuadTreeManager.cs:在Update中,调用tree的Inside
方法:拓展 Bou...
Desc:思路:GrassBendingRTPrePass: 利用 TrailRender 组件,将自动淡出的运动轨迹渲染到一张 RT 上,作为草地交互的信息源
InstancedIndirectGrassPosDefine: 定义草生成的世界坐标
UpdateAllInstanceTransformBufferIfNeeded: 更新草生成所需要的基础信息 例如: 计算生成草范围的中心坐标 包围盒 草地分块等基础信息 传入 Shader 和 ComputeShader
GeometryUtility.CalculateFrustumPlanes: 根据设置的距离计算出 Camera 的六个裁剪平面
GeometryUtility.TestPlanesAABB: 通过每个草地块构建 Bound 进行 AABB 碰撞测试,测试通过才会加入可见的草地块进入渲染流程
CullingComputeShader.Dispatch: 按照可见的草地块索引使用 ComputeShader 对草地块中每棵...
Desc:皮肤渲染的渲染过程可由两个分量组成: 镜面反射+次表面散射
镜面反射项(specular reflection) 相对而言很简单,Gems 3中推荐Kelemen and Szirmay-Kalos specular BRDF用于皮肤镜面反射项的计算。因为Kelemen and Szirmay-Kalos specular BRDF在实现和Torrance-Sparrow模型一样的渲染效果时,计算量要小得多。而现阶段基于物理的一些其他高光模型或改进方案也应该会得到不错的效果
次表面散射麻烦很多
总纲
现在学会的方式:预积分的皮肤渲染(Pre-Integrated Skin Rendering)来源实现效果
贴图生成
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293...
Desc:….
GC的优化降低GC操作的方法: 1. 减少GC的运行次数 2. 减少单词GC的时间 3. 将GC的运行时间延迟,避免在关键时间触发,如加载场景的时候调用GC
实现策略: 1. 对游戏进行重构,减少堆内存的分配和引用的分配。更少的变量和引用会减少GC操作的检测个数 (栈中的内存也是通过虚拟机进行释放的,栈内存存放的遍历有着确定的释放时间(生命周期),在调用方法时,会在内存中分配对应的一块空间(栈帧),当方法调用结束后,对应的栈帧就会被释放掉) 引用 2. 降低堆内存分配和回收的频率,尤其是关键时隔 3. 分析GC操作和堆内存拓展的时间,使其按照可预测的顺序执行
减少内存的方法: 1. 缓存变量: 重复利用(减少重复获取组件的操作) 2. 减少逻辑调用: 堆内存分配最坏的情况是反复调用的函数中进行堆内存的分配,可以考虑增加时间间隔,或者属性值变化的时候执行(监听特定的属性值) 3. 清楚链表: 进行链表分配得到时候清楚链表,而不是不停的生成新的链表(结合对象池)...
Desc:记录战斗系统的实现
AOI主要解决游戏中多人同屏的问题
目标离你的距离远超你九宫格的距离,你依然要将他显示出来。那这个时候该怎么办呢?所以,我们顺其自然地有了一个新的概念——“关注者“,AOI搜寻到的列表并不能就完全等同于关注者列表。而客户端显示的就是关注者列表里面的内容。AOI搜寻到的列表只是用来获得关注者的手段
AOI并不需要双向连接
以游戏场景为例的话,假如周边有很多玩家的话,你不一定需要严格按照位置远近来排序,而是需要把跟你关联度最高的玩家加到你的关注者列表中
AOI的信息需要立即更新吗?不一定需要,我们未必需要时时刻刻关注离我最近的目标,附近的人这个功能里面的用户列表更新频率慢一点也没关系
技能系统一个完整的技能系统逻辑层主要包括三个模块:技能模块,buff模块,projectile(子弹)模块
技能系统中,所有的技能里面不包含任何具体技能效果及逻辑,每个技能根据其类型提供若干抽象接口,具体执行效果由策划去配置
技能类型:被动技能\主动施法技能\开关类技能\激活类技能
被动技能一般会在技能初始化时生效,技能初始化时会有抽象行为接口Ablilty::OnAlil...
Desc:记录阅读 build in 中关于BRDF的笔记
法线分布项
多次表面反射微表面BRDF不考虑从微表面多次反射(“反弹”)的光。 这种简化会导致一些能量损失和过度暗化,特别是对于粗糙金属
薄膜干涉常见的是用MatCap方式实现波动光学BRDF模型ShaderToyShaderToy如何在UE5中做出带薄膜干涉的油污地面 - 落月满江树的文章
反射项:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687// 法线分布函数(各向同性)inline float GGXTerm (float NdotH, float roughness){ float a2 = roughness * roughness; float d = (NdotH * a2 - NdotH) * Ndot...
代码
代码
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980half3 ShaderGI(ToonSurfaceData surfaceData,ToonLightingData lightData){ half3 averageSH=SampleSH(0); averageSH=max(_IndirectLightMinColor,averageSH); return averageSH;}half3 ShadeSignleLight(ToonSurfaceData surfaceData,ToonLightingData lightData,Light light,bool isAdditionLight){ half3 N=normalize(lightData.nor...