run method

  1. @override
Vector4? run(
  1. Float32List v,
  2. ShaderBindings b,
  3. FragmentContext c
)
override

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);
}