flutter3d
Showcase Changelog 38 packages API reference

Auto exposure: the source

since 0.4.3 Post-processing

Regions the guide quotes: seed (line 24), auto (line 25), reads (line 60).

1/// Auto exposure: a meter reads the frame's own brightness and the next
2/// frame is exposed by what it found.
3///
4/// Quoted by `auto_exposure.md` and shown whole in the Source tab.
5library;
6
7import 'package:flutter3d/flutter3d.dart';
8import 'package:flutter3d_showcase/pages/post/post_stage.dart';
9import 'package:flutter3d_showcase/src/demo/demo.dart';
11final class AutoExposureDemo extends ShowcaseDemo {
12 double target = 0.18;
13 double speed = 1.5;
14 double seedExposure = 1.6;
16 @override
17 void configureView(DemoContext context) => PostStage.frame(context);
19 @override
20 Scene build(DemoContext context) => PostStage.build(context).scene;
22 @override
23 RenderSettings settings(DemoContext context) => RenderSettings(
24 exposure: seedExposure,
25 autoExposure: AutoExposureSettings(
26 enabled: true,
27 target: target,
28 speedUp: speed,
29 speedDown: speed,
30 ),
31 );
33 @override
34 List<DemoControl> controls(DemoContext context) => <DemoControl>[
35 SliderControl(
36 'Seed exposure',
37 min: 0.3,
38 max: 4,
39 value: () => seedExposure,
40 onChanged: (double v) => seedExposure = v,
41 ),
42 SliderControl(
43 'Target grey',
44 min: 0.05,
45 max: 0.4,
46 value: () => target,
47 onChanged: (double v) => target = v,
48 ),
49 SliderControl(
50 'Adaptation speed',
51 min: 0.2,
52 max: 6,
53 value: () => speed,
54 onChanged: (double v) => speed = v,
55 ),
56 ];
58 @override
59 void verify(Scene scene, FrameResult frame) {
60 if (!passRan(frame, 'luminance')) {
61 throw StateError('the luminance pass did not run: ${frame.skipped}');
62 }
63 if ((frame.exposure - seedExposure).abs() > 1e-6) {
64 throw StateError(
65 'the first frame should wear the seed exposure, since nothing has '
66 'been metered yet; it reported ${frame.exposure}',
67 );
68 }
69 }