跳到主要内容

自定义着色器

PlayCanvas 允许覆盖着色器代码块来定制渲染。代码块设置在全场景材质 app.scene.gsplat.material,因此一次修改影响全部单元。

每个着色阶段各有一个定制点:

代码块阶段执行频率用途
gsplatModifyVS顶点每单元一次修改位置、旋转、缩放、颜色和不透明度
gsplatModifyPS片元每覆盖像素一次修改最终片元颜色与 alpha

选择阶段​

**顶点阶段**适合对整个单元一致的操作,例如移动、缩放、旋转、隐藏或按位置染色。每单元一次,开销更低,也是唯一能改变几何体的阶段。

**片元阶段**适合在单元覆盖范围内变化的效果,例如采样纹理。每片元一次,重叠多时更昂贵。

两阶段可自由组合。也可通过 varying 数据流传递逐单元值,例如只分类一次,让片元只在需要时执行昂贵操作。

应用代码块​

两者模式相同:分别设置 GLSL(WebGL)和 WGSL(WebGPU)源码,再更新材质重新编译:

const sceneMat = app.scene.gsplat.material;

sceneMat.getShaderChunks('glsl').set('gsplatModifyVS', glslChunk);
sceneMat.getShaderChunks('wgsl').set('gsplatModifyVS', wgslChunk);
sceneMat.update();

自定义 uniform 每帧通过材质参数驱动:

app.on('update', (dt) => {
sceneMat.setParameter('uTime', currentTime);
sceneMat.update();
});

移除代码块​

删除覆盖并更新材质,恢复默认:

const sceneMat = app.scene.gsplat.material;
sceneMat.getShaderChunks('glsl').delete('gsplatModifyVS');
sceneMat.getShaderChunks('wgsl').delete('gsplatModifyVS');
sceneMat.update();

另请参见​