跳到主要内容
lod-visibility · 代码
查看代码目录
性能、采样与移动端质量 · source map

LOD:远处不是“删掉”,而是换一个合适的描述:代码定位

这里显示课程实际引用的代码片段。先看每段在说人话,再回到实验验证它对画面的影响。

← 回到对应自由实验状态
距离/屏幕 LOD

把距离和 bias 变成可见的 LOD level。

src/lib/lab/shader-performance/shaders.ts · section lod

当前起点查看这段精确实现
  // SECTION:lod - distance uses world depth; screen-size asks how large this
  // object projects through the current camera. They intentionally differ.
  float objectRadius = 0.2;
  #ifdef USE_INSTANCING
    objectRadius *= length(instanceMatrix[0].xyz);
  #endif
  float projectedRadius = projectionMatrix[1][1] * objectRadius / max(distanceToCamera, 0.001);
  float screenSizeMetric = 0.25 / max(projectedRadius, 0.001);
  float lodMetric = uLodMode < 1.5 ? distanceToCamera : screenSizeMetric;
  vLod = uLodMode < 0.5 ? 0.0 : clamp(floor(log2(max(lodMetric, 1.0)) + uLodBias), 0.0, 4.0);
  gl_Position = projectionMatrix * modelViewMatrix * localPosition;
}



precision highp float;
uniform int uDebugMode;
uniform int uBranchMode;
uniform float uBranchRatio;
uniform float uShaderWork;
uniform float uTextureReads;
uniform float uOverdrawLayers;
uniform float uTargetMs;
uniform float uEstimatedMs;
uniform bool uEarlyZEffective;
varying float vInstanceId;
varying float vLod;
实例数量

LOD 与批量绘制要同时检查,否则只省顶点没省提交。

src/lib/lab/shader-performance/shaders.ts · section instancing

按需展开查看这段精确实现
  // SECTION:instancing - instance data changes transforms without multiplying draw submissions
  vInstanceId = aInstanceId;
  vec4 localPosition = vec4(position, 1.0);
  #ifdef USE_INSTANCING
    localPosition = instanceMatrix * localPosition;
  #endif
  float distanceToCamera = length((modelViewMatrix * localPosition).xyz);
预算反馈

用帧预算验证降级到底有没有意义。

src/lib/lab/shader-performance/shaders.ts · section timeline

按需展开查看这段精确实现
// SECTION:timeline - show a budget ratio instead of pretending a single knob is performance
vec3 timelineColor() { float ratio = clamp(uEstimatedMs / max(uTargetMs, 0.01), 0.0, 1.8); return mix(vec3(0.17, 0.8, 0.48), vec3(0.94, 0.24, 0.16), clamp(ratio, 0.0, 1.0)); }