跳到主要内容

深度图层

某些渲染技术需要访问特定相机的场景深度或颜色缓冲区。深度图层(Depth Layer)是一种特殊图层,可加入相机的 layers 属性。图层的顺序决定在渲染过程中的哪个时刻捕获深度或颜色缓冲区。捕获后的缓冲区可供相机后续图层使用。

通常在所有不透明图层渲染完毕后捕获这些缓冲区,供后续透明图层或后处理使用。

此外,还需要通过脚本在 CameraComponent 上启用捕获:

要在屏幕上检查捕获的深度,使用 TextureRenderer.sceneDepth。

访问缓冲区​

要在着色器中将这些缓冲区作为纹理访问,使用以下 uniform 名称:

  • 颜色贴图:uSceneColorMap。
  • 深度贴图:uSceneDepthMap。

计算着色器不使用这些 uniform,而是通过计算实例访问相机贴图,参见场景深度和颜色贴图。

颜色空间处理​

使用 uSceneColorMap 时,必须正确处理颜色空间。场景颜色纹理可能包含经过伽马校正的值(向非 sRGB 目标进行 LDR 渲染时),也可能包含线性值(使用 CameraFrame 进行 HDR 渲染时)。

SCENE_COLORMAP_GAMMA 宏​

如果场景颜色贴图包含需要转换到线性空间的伽马校正值,引擎会自动提供 SCENE_COLORMAP_GAMMA 着色器宏。通常发生在 LDR 渲染时:相机向标准的非 sRGB 渲染目标输出经过伽马校正的颜色。

GLSL 示例:

vec3 sceneColor = texture2DLod(uSceneColorMap, uv, 0.0).rgb;

#ifdef SCENE_COLORMAP_GAMMA
// Convert from gamma to linear space
sceneColor = decodeGamma(sceneColor);
#endif

// Now sceneColor is in linear space for lighting calculations

WGSL 示例:

var sceneColor: vec3f = textureSampleLevel(uSceneColorMap, uSceneColorMapSampler, uv, 0.0).rgb;

#ifdef SCENE_COLORMAP_GAMMA
// Convert from gamma to linear space
sceneColor = decodeGamma3(sceneColor);
#endif

// Now sceneColor is in linear space for lighting calculations

decodeGamma() 和 decodeGamma3() 是内置工具函数,使用标准的 2.2 伽马曲线将伽马值转换为线性值。

更多线性工作流和颜色空间处理信息,参见线性工作流文档。

集成 CameraFrame​

使用 CameraFrame 进行 HDR 后处理时,可通过 rendering 设置请求深度和颜色贴图:

  • 颜色贴图:设置 cameraFrame.rendering.sceneColorMap = true,启用 uSceneColorMap 访问,例如用于折射或自定义后处理效果。
  • 深度贴图:设置 cameraFrame.rendering.sceneDepthMap = true,启用 uSceneDepthMap 访问,例如用于自定义雾或边缘检测等依赖深度的效果。

CameraFrame 中的颜色贴图包含线性 HDR 值,无需伽马校正,因此不会设置 SCENE_COLORMAP_GAMMA 宏。这保证了不同渲染配置下颜色空间处理的一致性。

颜色贴图的 mipmap​

颜色贴图具有 mipmap,粗糙折射材质通过采样它们来模糊背后的内容。自定义着色器使用 GLSL 的 texture2DLod 或 WGSL 的 textureSampleLevel 选择 mip 层级。相机组件的两个属性控制深度图层和 CameraFrame 捕获的颜色贴图的 mipmap:

  • sceneColorMapMipmapFilter 选择生成 mipmap 的滤波器。默认 MIPMAPFILTER_BOX 对成块纹素求平均,在强模糊折射中会呈现闪烁的块状效果。MIPMAPFILTER_GAUSSIAN 能平滑模糊,但生成 mipmap 的开销更高。
  • 将 sceneColorMapMipmaps 设为 false,可捕获不带 mipmap 的颜色贴图。此时折射始终清晰,适合透明玻璃或热扰动,同时省去逐帧生成 mipmap 的工作,以及约三分之一的颜色贴图内存。
// a smooth blur of rough refraction
cameraEntity.camera.sceneColorMapMipmapFilter = MIPMAPFILTER_GAUSSIAN;

// or, where only sharp refraction is needed
cameraEntity.camera.sceneColorMapMipmaps = false;

示例​

以下引擎示例演示深度和颜色贴图的渲染,以及使用它们的自定义着色器:

  • GrabPass 演示磨砂玻璃如何采样颜色缓冲区的模糊 mip 层级,并对比盒式和高斯 mipmap 滤波器:GrabPass。
抓取通道
  • GroundFog 演示深度缓冲区的使用:GroundFog。
地面雾
  • Dispersion 演示使用场景颜色纹理实现折射和色散:Dispersion。
色散