渲染管线总览
渲染跨越四个模块:引擎(决定何时渲染、包裹帧)、client.dll(决定渲染什么:视图、世界、实体、特效)、材质系统(材质/纹理/渲染上下文与命令队列)、Shader API(真正调用 D3D9/GL 或空实现)。本页给出一帧画面的调用链,并链接到子页面。
子页面:
- 客户端视图渲染管线(CViewRender):子视图、绘制顺序、阴影、后处理与 CS:GO 全屏效果
- 引擎世界渲染:BSP 表面、光照贴图与可见性:PVS/区域门户、世界列表、位移面、静态道具、贴花与投影阴影
- 材质系统与 Shader API
- 模型、动画与粒子
相关页面:主循环与 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 / shaderapiempty | D3D9(含 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仍只确认存在。 - 所有渲染顺序结论均来自静态阅读,未抓帧验证。