feat: Add bloom shader variant and enhance shader architecture in README

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-04-21 18:02:10 +02:00
parent b8917272f7
commit 6eb28ffcac
5 changed files with 494 additions and 154 deletions
@@ -37,12 +37,16 @@ class WolfGlslRenderer extends BaseWolfRenderer {
class _WolfGlslRendererState extends BaseWolfRendererState<WolfGlslRenderer> {
static const int _renderWidth = 960;
static const int _renderHeight = 600;
static const String _baseShaderAsset =
'packages/wolf_3d_flutter/shaders/wolf_world.frag';
static const String _bloomShaderAsset =
'packages/wolf_3d_flutter/shaders/wolf_world_bloom.frag';
final SoftwareRenderer _renderer = SoftwareRenderer();
ui.Image? _renderedFrame;
ui.FragmentProgram? _shaderProgram;
ui.FragmentShader? _shader;
ui.FragmentShader? _baseShader;
ui.FragmentShader? _bloomShader;
bool _isShaderUnavailable = false;
@override
@@ -99,7 +103,11 @@ class _WolfGlslRendererState extends BaseWolfRendererState<WolfGlslRenderer> {
return const CircularProgressIndicator(color: Colors.white24);
}
if (_isShaderUnavailable || _shader == null) {
final ui.FragmentShader? activeShader = widget.bloomEnabled
? _bloomShader
: _baseShader;
if (_isShaderUnavailable || activeShader == null) {
// Keep frames visible even if GLSL initialization failed.
return Padding(
padding: const EdgeInsets.all(16.0),
@@ -117,9 +125,8 @@ class _WolfGlslRendererState extends BaseWolfRendererState<WolfGlslRenderer> {
child: CustomPaint(
painter: _GlslFramePainter(
frame: _renderedFrame!,
shader: _shader!,
shader: activeShader,
effectsEnabled: widget.effectsEnabled,
bloomEnabled: widget.bloomEnabled,
elapsedSeconds: widget.engine.timeAliveMs / 1000.0,
),
child: const SizedBox.expand(),
@@ -130,15 +137,18 @@ class _WolfGlslRendererState extends BaseWolfRendererState<WolfGlslRenderer> {
Future<void> _loadShader() async {
try {
final ui.FragmentProgram program = await ui.FragmentProgram.fromAsset(
'packages/wolf_3d_flutter/shaders/wolf_world.frag',
final List<ui.FragmentProgram> programs = await Future.wait(
<Future<ui.FragmentProgram>>[
ui.FragmentProgram.fromAsset(_baseShaderAsset),
ui.FragmentProgram.fromAsset(_bloomShaderAsset),
],
);
if (!mounted) {
return;
}
setState(() {
_shaderProgram = program;
_shader = _shaderProgram!.fragmentShader();
_baseShader = programs[0].fragmentShader();
_bloomShader = programs[1].fragmentShader();
_isShaderUnavailable = false;
});
} catch (_) {
@@ -157,14 +167,12 @@ class _GlslFramePainter extends CustomPainter {
final ui.Image frame;
final ui.FragmentShader shader;
final bool effectsEnabled;
final bool bloomEnabled;
final double elapsedSeconds;
_GlslFramePainter({
required this.frame,
required this.shader,
required this.effectsEnabled,
required this.bloomEnabled,
required this.elapsedSeconds,
});
@@ -179,7 +187,6 @@ class _GlslFramePainter extends CustomPainter {
..setFloat(3, texelY)
..setFloat(4, effectsEnabled ? 1.0 : 0.0)
..setFloat(5, elapsedSeconds)
..setFloat(6, bloomEnabled ? 1.0 : 0.0)
..setImageSampler(0, frame);
final Paint paint = Paint()
@@ -194,7 +201,6 @@ class _GlslFramePainter extends CustomPainter {
return oldDelegate.frame != frame ||
oldDelegate.shader != shader ||
oldDelegate.effectsEnabled != effectsEnabled ||
oldDelegate.bloomEnabled != bloomEnabled ||
oldDelegate.elapsedSeconds != elapsedSeconds;
}
}