run method
Returns linear RGBA for attachment zero. Null discards the fragment.
Implementation
@override
Vector4? run(Float32List v, ShaderBindings bindings, FragmentContext c) {
final u = v[0];
final w = v[1];
final inputs = <String, List<double>>{
'uv': <double>[u, w],
if (program.inputsUsed.contains('sceneDepth'))
'sceneDepth': <double>[
switch (bindings.textures['surface_texture']) {
null => _nothingBehind,
final surface => switch (surface.sample(u, w).w) {
final stored when stored > 0.0 => stored,
_ => _nothingBehind,
},
},
],
};
final result = evaluateMaterial(
program,
MaterialSurfaceValues(
inputs: inputs,
uniforms: <String, List<double>>{
for (final parameter in program.parameters)
if (parameter.uniform)
parameter.name: ?bindings.read(parameter.block!, parameter.name),
},
sample: (slot, u, w) {
final texture = bindings.textures[slot.bindingName];
if (texture == null) return const <double>[0, 0, 0, 0];
final texel = texture.sample(u, w);
return <double>[texel.x, texel.y, texel.z, texel.w];
},
),
);
return Vector4(result[0], result[1], result[2], result[3]);
}