Cesium 中 DerivedCommand
的作用
根据代码看,DerivedCommand
主要实现了以下几点:
-
- 从原始 shader 程序派生出仅写深度(depth only)的 shader 程序和渲染状态。通过
getDepthOnlyShaderProgram
和getDepthOnlyRenderState
实现。
- 从原始 shader 程序派生出仅写深度(depth only)的 shader 程序和渲染状态。通过
-
- 创建仅写深度的
DerivedCommand
,通过createDepthOnlyDerivedCommand
实现。
从原始 shader 程序派生出输出日志深度(log depth)的 shader 程序。通过getLogDepthShaderProgram
实现。
- 创建仅写深度的
-
- 创建输出日志深度的
DerivedCommand
,通过createLogDepthCommand
实现。
从原始 shader 程序派生出 picking pass 使用的 shader 程序。通过getPickShaderProgram
实现。
- 创建输出日志深度的
-
- 创建 picking pass 使用的
DerivedCommand
,通过createPickDerivedCommand
实现。
从原始 shader 程序派生出 HDR 渲染使用的 shader 程序。通过getHdrShaderProgram
实现。
- 创建 picking pass 使用的
-
- 创建 HDR 渲染使用的
DerivedCommand
,通过createHdrCommand
实现。
- 创建 HDR 渲染使用的
总结一下, DerivedCommand
通过派生出不同用途的 shader
程序和对应的渲染状态, 从原始 DrawCommand
创建出各种 DerivedCommand
,比如仅写深度、对数深度、picking pass 以及 HDR 渲染所需的 DerivedCommand
。这些功能可以避免重复编写类似代码,提供了很好的代码复用。
// 更新派生命令
fn updateDerivedCommands() {
//...
if (defined(command.pickId)) {
// derivedCommands 是更加command的参数生成的
derivedCommands.picking = DerivedCommand.createPickDerivedCommand(
scene,
command,
context,
derivedCommands.picking
);
}
//...
}