Capturing a frame: the source
Open the live demo · Read the guide · View on GitHub
Regions the guide quotes: probe (line 21), capture (line 41), scene (line 54), check (line 80).
1/// A frame recorded pass by pass, with the pixels each pass wrote.
2library;
4import 'package:flutter3d/flutter3d.dart';
5import 'package:flutter3d_showcase/src/demo/demo.dart';
6import 'package:vector_math/vector_math.dart';
8final class FrameCaptureDemo extends ShowcaseDemo {
9 late final FrameCapture _capture;
12 void configureView(DemoContext context) {
13 context.orbit
14 ..distance = 5.0
15 ..pitch = 0.2
16 ..yaw = 0.4;
17 }
20 Future<void> prepare(DemoContext context) async {
21 final Scene probe = Scene()
22 ..add(
23 MeshNode(
24 DeviceMesh.upload(
25 context.device,
26 CuboidShape(size: Vector3.all(1.2)).build(),
27 ),
28 Material(name: 'probe', baseColor: Vector4(0.85, 0.42, 0.18, 1.0)),
29 name: 'probe cube',
30 ),
31 )
32 ..add(
33 LightNode(name: 'sun', intensity: 3.0)
34 ..setLocalForward(Vector3(-0.4, -0.8, -0.3)),
35 );
36 final CameraNode probeCamera = CameraNode()
37 ..setPosition(0.0, 0.0, 4.0)
38 ..lookAt(Vector3.zero());
39 probe.add(probeCamera);
41 final Future<FrameCapture> pending = context.renderer.captureNextFrame();
42 context.renderer.render(
43 width: 96,
44 height: 96,
45 scene: probe,
46 views: <RenderView>[RenderView(camera: probeCamera)],
47 settings: const RenderSettings(),
48 );
49 _capture = await pending;
50 }
53 Scene build(DemoContext context) {
54 final Scene scene = Scene()
55 ..ambientColor = Vector3(0.42, 0.48, 0.64)
56 ..ambientIntensity = 0.16
57 ..add(
58 MeshNode(
59 DeviceMesh.upload(
60 context.device,
61 const TorusShape(radius: 1.0, tubeRadius: 0.4).build(),
62 ),
63 Material(
64 name: 'torus',
65 baseColor: Vector4(0.28, 0.62, 0.9, 1.0),
66 roughness: 0.4,
67 ),
68 name: 'torus',
69 ),
70 )
71 ..add(
72 LightNode(name: 'sun', intensity: 3.2)
73 ..setLocalForward(Vector3(-0.42, -0.8, -0.34)),
74 );
75 return scene;
76 }
79 void verify(Scene scene, FrameResult frame) {
80 final CapturedPass? scenePass = _capture.passNamed('scene');
81 final CapturedImage? colour = scenePass?.imageOf('hdr_colour');
82 if (scenePass == null ||
83 !scenePass.active ||
84 colour == null ||
85 colour.isBlack ||
86 frame.drawCalls < 1) {
87 throw StateError('the captured frame did not record a lit scene pass');
88 }
89 }
90}