跳到主要内容

顶点阶段

gsplatModifyVS 每单元执行一次,适合移动、旋转、缩放、隐藏或为整个单元染色。

查看实时示例:动画中的代码块定制。

查看实时示例

可覆盖函数​

可覆盖三个函数:

函数用途
modifySplatCenter变换模型空间中心位置
modifySplatRotationScale调整旋转四元数和缩放
modifySplatColor修改颜色和不透明度
void modifySplatCenter(inout vec3 center);
void modifySplatRotationScale(vec3 originalCenter, vec3 modifiedCenter, inout vec4 rotation, inout vec3 scale);
void modifySplatColor(vec3 center, inout vec4 color);

只需实现需要修改的函数。

示例原理​

示例用正弦位移和金色脉冲驱动所有单元,分三步:

1. 编写代码块,覆盖所需函数。示例使用 uTime:

uniform float uTime;

void modifySplatCenter(inout vec3 center) {
float heightIntensity = center.y * 0.2;
center.x += sin(uTime * 5.0 + center.y) * 0.3 * heightIntensity;
}

void modifySplatRotationScale(vec3 originalCenter, vec3 modifiedCenter, inout vec4 rotation, inout vec3 scale) {
// no modification
}

void modifySplatColor(vec3 center, inout vec4 clr) {
float sineValue = abs(sin(uTime * 5.0 + center.y));
vec3 gold = vec3(1.0, 0.85, 0.0);
float blend = smoothstep(0.9, 1.0, sineValue);
clr.xyz = mix(clr.xyz, gold, blend);
}

2. 应用到全局材质并更新重新编译。GLSL 和 WGSL 同时设置,覆盖两个后端:

const sceneMat = app.scene.gsplat.material;

sceneMat.getShaderChunks('glsl').set('gsplatModifyVS', glslVertShader);
sceneMat.getShaderChunks('wgsl').set('gsplatModifyVS', wgslVertShader);
sceneMat.update();

3. 每帧驱动 uniform:

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

代码块使用的每个 uniform 和纹理都要设置在材质上,不支持设备作用域的全局值。

另请参见​