CD Code Digest Hub /CS:GO

渲染管线总览

8 分钟阅读 5 个章节 1 张图

渲染跨越四个模块:引擎(决定何时渲染、包裹帧)、client.dll(决定渲染什么:视图、世界、实体、特效)、材质系统(材质/纹理/渲染上下文与命令队列)、Shader API(真正调用 D3D9/GL 或空实现)。本页给出一帧画面的调用链,并链接到子页面。

子页面:

相关页面:主循环与 Tick · 游戏 DLL 契约 · HUD

相关源码文件#

  • 引擎:engine/host.cpp、engine/gl_screen.cpp、engine/view.cpp、engine/gl_shader.cpp、engine/gl_rmain.cpp、engine/gl_rsurf.cpp、engine/l_studio.cpp
  • 客户端:game/client/view.cpp、game/client/viewrender.cpp、game/client/cstrike15/cs_view_scene.cpp、game/client/cdll_client_int.cpp
  • 材质系统:materialsystem/cmaterialsystem.cpp

1. 一帧画面#

证据:

  • 渲染阶段由 _Host_RunFrame_Render 调用 Host_UpdateScreen → SCR_UpdateScreen:engine/host.cpp:3430-3453、engine/host.cpp:2856-2867。
  • SCR_UpdateScreen:materials->BeginFrame、渲染 Scaleform 帧开始槽、VGUI 模拟、FRAME_RENDER_START、Shader_BeginRendering、V_RenderView、Scaleform 帧结束槽、FRAME_RENDER_END、materials->EndFrame:engine/gl_screen.cpp:209、engine/gl_screen.cpp:263-324。
  • V_RenderView 计算客户端视口后调用 g_ClientDLL->View_Render:engine/view.cpp:210、engine/view.cpp:258-259;client.dll 转给 view->Render:game/client/cdll_client_int.cpp:2222-2235。
  • FRAME_RENDER_START 时客户端执行插值、客户端动画、数据变化事件与 SimulateEntities:game/client/cdll_client_int.cpp:3410-3418、game/client/cdll_client_int.cpp:3234-3323。
  • 交换缓冲区通过 Shader_SwapBuffers → materials->SwapBuffers():engine/gl_shader.cpp:100-103。

2. 客户端视图渲染#

CViewRender::Render 遍历分屏玩家,处理视口缩放与工具框架的视口调整,然后为每个视图调用 RenderView:game/client/view.cpp:1044-1070。RenderView 的骨架是:3D 天空盒视图 → 主场景 ViewDrawScene(内部按水面类型选择世界视图,每个世界视图依次画世界不透明几何、不透明实体、贴花/覆盖层、半透明物)→ 景深/运动模糊 → 视图模型 → 引擎后处理(色调映射、bloom、色彩校正)→ 屏幕空间效果与描边 → 2D/HUD:game/client/viewrender.cpp:3012-3017、game/client/viewrender.cpp:3114-3173、game/client/viewrender.cpp:3226-3277、game/client/viewrender.cpp:3336-3400、game/client/viewrender.cpp:3526-3597。CS:GO 使用派生的 CCSViewRender,增加夜视、闪光致盲、烟雾遮罩等全屏效果:game/client/cstrike15/cs_view_scene.cpp:55-59、game/client/cstrike15/cs_view_scene.cpp:349、game/client/cstrike15/cs_view_scene.cpp:511-522。

完整流程、视图对象模型、绘制顺序表与阴影/后处理链见 客户端视图渲染管线;客户端经 IVRenderView(render->BuildWorldLists、render->DrawWorldLists 等)调用的引擎侧世界渲染见 引擎世界渲染。

3. 模块分工#

层模块职责详见
时机engine帧包裹、视口、IVModelRender 实现本页、模型、动画与粒子
视图编排client.dll(CViewRender/CCSViewRender)子视图、绘制顺序、阴影(CSM)、后处理、CS:GO 全屏效果、HUD 合成客户端视图渲染管线
世界engine(gl_rsurf、gl_lightmap、mod_vis、r_areaportal、staticpropmgr、shadowmgr)PVS/区域门户裁剪、世界列表、光照贴图、位移面、静态道具、贴花/覆盖层、投影阴影引擎世界渲染
抽象materialsystem材质/纹理/渲染上下文、队列线程材质系统
设备shaderapidx9 / shaderapiemptyD3D9(含 DX→GL 转译)或空实现材质系统
模型studiorender + bonesetup + datacache(+ 客户端 CModelRenderSystem 快速路径)骨骼、蒙皮、flex、LOD、绘制模型、动画与粒子
特效particles粒子定义(DMX)与模拟模型、动画与粒子

约束与边界#

  • 专用服务器不调用渲染阶段(shouldrender = !sv.IsDedicated()):engine/host.cpp:4055、engine/host.cpp:4528-4555。
  • 引擎的大部分世界渲染文件在 DEDICATED 构建中不编译:engine/engine_inc.vpc:165-192。
  • 阴影、水面反射/折射、后处理、色彩校正、HDR 色调映射已在 客户端视图渲染管线 中展开到调用链层级;各 Shader(.fxc)的算法、togl(D3D→OpenGL)与 ps3gcm 仍只确认存在。
  • 所有渲染顺序结论均来自静态阅读,未抓帧验证。