1-WebGLRenderListMini的代码
src\renderers\webgl\WebGLRenderListMini.js
php
/**
* 单帧渲染项列表。Mini 版只有 opaque 队列
*/
function WebGLRenderListMini() {
const opaque = [];
function push( object, geometry, material ) {
opaque.push( {
id: object.id,
object: object,
geometry: geometry,
material: material,
});
}
return {
opaque: opaque,
push: push,
};
}
export { WebGLRenderListMini };
2-WebGLRenderListMini 的功能定位
WebGLRenderList 是WebGL 渲染器 里负责 收集、分类、排序待渲染物体 的模块。
WebGLRenderList 本身不画任何东西,而是为 WebGLRenderer 准备一份「这一帧要画什么、按什么顺序画」的列表。
WebGLRenderList 导出2个工厂函数:
- WebGLRenderList:单次渲染用的列表,分成opaque → transmissive → transparent 三类,并按此顺序绘制。
- WebGLRenderLists:按
scene缓存多个WebGLRenderList,支持嵌套渲染。
WebGLRenderListMini 就比较简单了,只有opaque 队列,其职责很单纯:
- 维护一个
opaque数组 push(object, geometry, material)往里塞一项- 对外暴露
{ opaque, push }
3-和完整版 WebGLRenderLists 的差别
| Mini | 完整版 WebGLRenderList |
|
|---|---|---|
| 队列 | 只有 opaque |
opaque / transparent / transmissive |
| 排序 | 无(场景遍历顺序) | painterSortStable 等,按 renderOrder、材质、深度 |
| 字段 | id, object, geometry, material |
还多 z, groupOrder, renderOrder, group, materialVariant |
| 对象池 | 每帧 new + 直接 push 新对象 |
renderItems 池化复用,init/finish |
| 列表管理 | 每帧新建一个 list | WebGLRenderLists + WeakMap 按 scene 缓存 |
Mini 版假设:只画不透明、Mesh、材料简单,所以不需要透明从后往前画、transmission、多场景缓存等。
设计意图
把「场景树遍历」和「 draw call」拆开。