run method
Returns linear RGBA for attachment zero. Null discards the fragment.
Implementation
@override
Vector4? run(Float32List v, ShaderBindings b, FragmentContext c) {
final surface = b.textures['surface_texture'];
if (surface == null) return Vector4(0.0, 0.0, 0.0, 1.0);
final lens = b.vec4('DofTileInfo', 'lens', Vector4.zero());
final params = b.vec4('DofTileInfo', 'params', Vector4.zero());
final source = b.vec4('DofTileInfo', 'source', Vector4.zero());
final target = b.vec4('DofTileInfo', 'target', Vector4.zero());
final taps = (source.z + 0.5).floor();
final texelX = (v[0] * target.x).floorToDouble();
final texelY = (v[1] * target.y).floorToDouble();
final row = (texelY + 0.5) * source.y;
final first = texelX * taps;
var largest = 0.0;
for (var i = 0; i < 64 && i < taps; i++) {
final depth = surface.sample((first + i + 0.5) * source.x, row).w;
largest = math.max(
largest,
DepthOfFieldShader.circleOfConfusion(
depth,
focusDistance: lens.x,
focalLength: lens.y,
aperture: lens.z,
maxRadius: params.z,
texelsPerMeter: params.w,
),
);
}
return Vector4(largest, 0.0, 0.0, 1.0);
}