PostProcessStageComposite 是一个用于在场景中进行后处理的组合器。它允许将多个后处理阶段组合起来,以产生更复杂的效果。每个 PostProcessStage 都可以通过 inputs 属性来接收来自其它阶段的输出。
PostProcessStageComposite要创建一个 PostProcessStageComposite 对象,我们需要给它一个名称:
var myComposite = new Cesium.PostProcessStageComposite({
name: 'My Composite'
});
PostProcessStage要将一个或多个 PostProcessStage 添加到 PostProcessStageComposite 中,我们可以使用 add() 方法:
myComposite.add({
fragmentShaderSource : '...shader code...',
uniforms: {
//...uniform variables...
}
});
myComposite.add({
fragmentShaderSource : '...shader code...',
uniforms: {
//...uniform variables...
},
inputs: [
myComposite.stages[0].output
]
});
注意,每个 PostProcessStage 都必须具有唯一的名称,因为我们可以使用名称来引用它。如果我们不提供名称,则会自动分配一个名称。
除了属性 fragmentShaderSource 和 uniforms,还有一些其他属性,如 clearColor、clearDepth、cullEnabled 等,用于控制每个阶段的输出。这些属性的值将作为材料渲染的一部分被传递给 GLSL 着色器。
要将一个阶段的输出连接到另一个阶段的输入,我们可以使用 inputs 属性。例如,假设我们有两个阶段——stage1 和 stage2。要将 stage1 的输出作为 stage2 的输入,我们可以将以下代码添加到 stage2 的定义中:
inputs: [
stage1.output
]
这将创建一个输入变量并将其传递给 fragment shader。在 fragment shader 中,我们可以像访问纹理一样访问它:
uniform sampler2D u_input0;
void main() {
vec4 color = texture2D(u_input0, gl_FragCoord.xy / czm_viewport.zw);
//...do something with color...
}
可以在一个 PostProcessStage 中使用多个输入变量。只需添加更多的 inputs 属性即可。
PostProcessStage要从 PostProcessStageComposite 中删除 PostProcessStage,我们可以使用 remove() 方法:
myComposite.remove('stage1');
其中 'stage1' 是我们要删除的阶段的名称。
PostProcessStage要从 PostProcessStageComposite 中获取一个阶段,我们可以使用 get() 方法:
var myStage = myComposite.get('stage1');
其中 'stage1' 是要获取的阶段的名称。
PostProcessStage要更新一个 PostProcessStage 的着色器代码或 uniform 变量,我们可以使用 update() 方法:
myComposite.update('stage1', {
fragmentShaderSource : '...new shader code...',
uniforms: {
//...updated uniform values...
}
});