setup method
Creates render targets and shaders for a physical-pixel viewport.
Implementation
@override
Future<void> setup({
required int width,
required int height,
bool enableProfiling = false,
}) async {
final library = gpu.ShaderLibrary.fromAsset(
'packages/flutter_gaussian_splatter/build/shaderbundles/'
'flutter_gaussian_splatter.shaderbundle',
);
if (library == null) {
throw StateError('Failed to load flutter_gpu shader bundle.');
}
_vertexShader = library['SplatVertex']!;
_fragmentShader = library['SplatFragment']!;
_pipeline = gpu.gpuContext.createRenderPipeline(
_vertexShader,
_fragmentShader,
);
_frameInfoSlot = _vertexShader.getUniformSlot('FrameInfo');
_batchInfoSlot = _vertexShader.getUniformSlot('BatchInfo');
_atlasSlot = _vertexShader.getUniformSlot('u_texture');
_orderSlot = _vertexShader.getUniformSlot('u_order_texture');
_quatSlot = _vertexShader.getUniformSlot('u_quat_texture');
_colorSlot = _vertexShader.getUniformSlot('u_color_texture');
_shSlot = _vertexShader.getUniformSlot('u_sh_texture');
_resolvedSlot = _vertexShader.getUniformSlot('u_resolved_texture');
_frameUniforms = gpu.gpuContext.createHostBuffer();
_quadVertexBuffer =
gpu.gpuContext.createDeviceBufferWithCopy(_buildQuadVertexData());
_skyVertexShader = library['SkyVertex']!;
_skyFragmentShader = library['SkyFragment']!;
_skyPipeline = gpu.gpuContext.createRenderPipeline(
_skyVertexShader,
_skyFragmentShader,
);
_skyInfoSlot = _skyFragmentShader.getUniformSlot('SkyInfo');
_skyBgSlot = _skyFragmentShader.getUniformSlot('u_bg');
_skyVertexBuffer =
gpu.gpuContext.createDeviceBufferWithCopy(_buildSkyVertexData());
// SH resolve pass reuses the fullscreen-triangle SkyVertex shader.
_shResolveFragmentShader = library['ShResolveFragment']!;
_shResolvePipeline = gpu.gpuContext.createRenderPipeline(
_skyVertexShader,
_shResolveFragmentShader,
);
_shResolveInfoSlot =
_shResolveFragmentShader.getUniformSlot('ShResolveInfo');
_shResolveShSlot = _shResolveFragmentShader.getUniformSlot('u_sh_texture');
_shResolveColorSlot =
_shResolveFragmentShader.getUniformSlot('u_color_texture');
_cacheUniformLayouts();
_target = _createTarget(width, height);
}