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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user