乱斗西游NeoX引擎的开发经验
NeoX目前支持了OpenGL ES和Metal两套API,同时支持多线程渲染的特性。
- 逻辑和渲染拆分成两个独立的线程,更好的运用多核运算(缺点:饥饿,死锁,Crash)
- 创建共享GL上下文来实现OpenGL的多线程渲染(!OpenGL ES上下文并不保证线程安全)
- 通过线程ID映射GLContext,每一个渲染线程独占一个GL Context
- RenderQueue使用一个LockFree的RingBuffer执行渲染命令
- 使用Double-Buffer(空间换时间)避免锁的使用。
注意事项:任何线程都能创建GPU资源,使用OpenGL时结束调用要调用glFlush(每个GLContext都有一个CommandQueue);GPU资源销毁的操作必须在渲染线程中执行。
推荐参考BGFX库的实现
《无尽战区》渲染迭代经验
风格化的渲染在最近开始流行起来,比如Valve的Team Fortress军团要塞2
、暴雪的守望先锋
以及Epic的Kite Demo
。
卡通风格渲染
卡通风格渲染一般具备以下特点:
- 动漫贴图画法和着色
- 描边处理
- 风格化处理
TF2的解决方案是使用了:
- Modified Lambertian Terms
- Warping Function
- Rim Lighting
- Spatially-varying Directional Ambient
f(x)=kd[a(n⃗ )+∑i=1Lciw((α(n⃗ ⋅l⃗ i)+β)r)]
Warping Function(核心) : 12(n⃗ ⋅l⃗ )+12
在他们的分享中也提到了线性工作流(Linear WorkFlow)的重要性,以及模型美术资源外包制作的一些坑。
Cloud GI(离线渲染LightMap )
关键词:Data-Parallel Octree, Radiosity, Point Cloud, Surfel
GPU上的八叉树构建和编码
大致方案:
- 全局光照算法(Point Cloud Based GI)的思路参考Point-Based Approximate Color Bleeding论文. (RenderMan使用的全局光算法)
- 八叉树(管理点云,每个节点记录颜色和球谐系数)快速构建算法的实现参考了Data-Parallel Octrees For surface Reconstruction论文
- Light Map裂缝处理使用了Gutter方法
《天谕》大世界的渲染方案
资源控制
Budget系统:
所有资源都有优先级,不再用的资源尽可能换出。
LOD
- 贴图LOD(缩略图-原图-大图):
- 自动Stream大图
- Device Lost的时候直接删除原图
- D3D9使用DEFAULT POOL管理贴图
- 贴图权重定义
- 法线贴图>漫反射贴图>高光贴图
- 离镜头越近权重越高
- 包围盒越大权重越高?
合并DrawCall
使用Proxy系统合并模型焊接顶点以减少DrawCall。
…待续