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...
}
});