自定义着色器
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();
另请参见
- 顶点阶段:移动、缩放和染色。
- 片元阶段:逐像素颜色。
- Varying 数据流:逐单元传值。
- 重新光照:基于片元钩子使用代理网格照明。
- 工作缓冲区渲染:定制绘制排序后单元的全局通道。