A-SHIN BLOG

好记性不如烂笔头

Loading.LockPersistentManager问题解析

"Unity引擎魔改"

“Yeah It’s on. ” 资源加载机制: 主线程ReadObject时,如果资源未加载,则会等待m_Mutex直到可用后进行资源加载,如果此时子线程正在加载资源,占用了m_Mutex,则主线程等待m_Mutex时造成了阻塞。 产生问题的原因: 引用关系在standalone下使用PPtr仅保存InstanceID进行关联,引用的object析构时,PPtr的Ins...

TextureStreaming Optimize

"Unity引擎魔改"

“Yeah It’s on. ” 编辑器设置: Quality设置 Texture Streaming Budget:显存的预算 Texture Streaming Mipmaps Renderers Per Frame:每帧(每个Batch)处理的Renderers的个数 Texture Streaming Mipmaps Max Level Reduction:至少保留的Mi...

Software Rasterization Z-Buffer Ocllusion Culling

"Unity引擎魔改"

“Yeah It’s on. ” 背景介绍 由于上篇HZB进行深度比较时,当前屏幕空间下被遮挡的较大物体需要降采样与高mipmap等级的Depth Texture比较,而高mipmap等级的Depth Texture在降采样时周边较大深度的像素污染当前像素从而保存了较大的深度,引起该物体深度小于Depth Texture对应点的深度,造成该较大物体未被剔除。 优化方案 在HZB之...

Hierarchical Z-Buffer Occlusion Culling

"Unity引擎魔改"

“Yeah It’s on. ” 前言 unreal的hzb oc相比unity的umbra oc性能提升显著并且无需开发者操心。由于unity源码受专利保护,因此仅简单介绍unity移植unreal hzb的思路 正文 在unity cull阶段之后,render阶段之前,对cull result(包括灯光)进行hzb可见性测试,根据renderer的hzbId并且fra...

PBS IBL Sepcular

"游戏引擎"

“Yeah It’s on. ” 前言 接上篇PBS IBL Diffuse,这次实现了基于图像的光照specular部分。 IBL SPECULAR PBS效果如下: 正文 渲染方程 上上篇给出的渲染方程: $L_o = \int_\Omega (f_d + f_s) L_i (n \cdot w_i){\rm d}w_i$ 本篇处理Specular部分: $L_o=\...

PBS IBL Diffuse

"游戏引擎"

“Yeah It’s on. ” 前言 最近在往引擎中添加基于物理的着色,接上篇直接光照PBS,这次实现了基于图像的光照,此篇介绍diffuse部分的实现。 IBL DIFFUSE PBS效果如下: 正文 渲染方程 上篇给出的渲染方程: $L_o = \int_\Omega (f_d + f_s) L_i (n \cdot w_i){\rm d}w_i$ 本篇处理漫反射部分...

PBS direct illumination section

"游戏引擎"

“Yeah It’s on. ” 前言 最近在往引擎中添加基于物理的着色,实现了直接光照部分,后续调整引擎框架实现通用的render texture组件后利用IBL和预计算实现间接光照及性能优化。 直接光照PBS效果如下: 正文 渲染方程 完整的渲染方程: $L_o = \int_\Omega f(p_i, w_i, w_o) L_i(p_i, w_i) n \cdot w_...

Pre-Integrated Skin Shading

"游戏引擎"

“Yeah It’s on. ” 前言 游戏中对于真实感皮肤渲染主要采用次表面散射(Subsurface Scattering)模型,就是我们熟称的SSS材质。 SSS渲染前后对比图: 正文 次表面散射 实际渲染中,如果光线出射点的位置和入射点相距不足一个像素,我们就认为入射点和出射点位置相同,这时候当前像素的光照只受其自身影响;如果入射点和出射点相距超过一个像素,则表示某个...

CocosCreator transform atlas uv coord into frame uv coord in shader

"开发笔记"

“Yeah It’s on. ” 前言 shader编写时很多效果会用到uv坐标,creator中uv左上角为(0,0),右下角为(1,1)。然而如果我们使用的不是单独的texture,而是TexturePacker这些三方软件打出来的图集或者使用了creator的自动图集功能。那么shader中获取的内置uv0变量表示的是该像素在图集中的坐标,并不是在该spriteframe中的...

游戏数据设计及读写中间件

"开发笔记"

“Yeah It’s on. ” 前言 程序=数据+算法 游戏开发过程中数据处理必不可少,不管是面向对象还是面向数据的编程方式都会将同一模块的数据封装在一起,需要进行本地存储时,用一个key将该数据对象完整的序列化保存。 export class PlayerInfo { public static className = "PlayerInfo"; privat...