phaserjs/phaser · error · Error

BaseFilterShader: No fragment shader source provided and no

Error message

BaseFilterShader: No fragment shader source provided and no shader found with key 

What it means

Thrown by BaseFilterShader.initialize when no fragmentShaderSource argument is provided AND the shader cache has no entry for fragmentShaderKey (or the entry has no .glsl). BaseFilterShader can resolve its shader from either inline source or the shader cache, but if neither is present it cannot build the GLSL program for the filter.

Source

Thrown at src/renderer/webgl/renderNodes/filters/BaseFilterShader.js:57

 * @constructor
 * @since 4.0.0
 * @param {string} name - The name of the filter.
 * @param {Phaser.Renderer.WebGL.RenderNodes.RenderNodeManager} manager - The manager that owns this filter.
 * @param {string} [fragmentShaderKey] - The key of the fragment shader source in the shader cache. This will only be used if `fragmentShaderSource` is not set.
 * @param {string} [fragmentShaderSource] - The fragment shader source.
 * @param {?Phaser.Types.Renderer.WebGL.ShaderAdditionConfig[]} [shaderAdditions] - An array of shader additions to apply to the shader program.
 */
var BaseFilterShader = new Class({
    Extends: BaseFilter,

    initialize: function BaseFilterShader (name, manager, fragmentShaderKey, fragmentShaderSource, shaderAdditions)
    {
        if (!fragmentShaderSource)
        {
            var baseShader = manager.renderer.game.cache.shader.get(fragmentShaderKey);
            if (!(baseShader && baseShader.glsl))
            {
                throw new Error('BaseFilterShader: No fragment shader source provided and no shader found with key ' + fragmentShaderKey);
            }
            fragmentShaderSource = baseShader.glsl;
        }

        BaseFilter.call(this, name, manager);

        var renderer = manager.renderer;
        var gl = renderer.gl;

        var config = {
            name: name,
            shaderName: name,
            vertexSource: SimpleTextureVert,
            fragmentSource: fragmentShaderSource,
            shaderAdditions: shaderAdditions || [],
            vertexBufferLayout: {
                usage: 'DYNAMIC_DRAW',
                count: 4,

View on GitHub (pinned to 41be1e462b)

Solutions

  1. Preload the shader GLSL with this.load.shader() (or the appropriate loader) using the exact key the filter references.
  2. Pass fragmentShaderSource directly as a string if you do not want to use the cache.
  3. Verify the cache: game.cache.shader.has(fragmentShaderKey) and that the entry's .glsl is a non-empty string.
  4. Check spelling/casing of the key against the loader call.

Example fix

// before
new CustomFilter(manager, 'myFilter'); // source missing, key not loaded

// after
this.load.shader('myFilter', 'assets/shaders/myFilter.frag');
// then in create:
new CustomFilter(manager, 'myFilter');
Defensive patterns

Strategy: validation

Validate before calling

const cached = game.cache.shader.get(fragmentShaderKey);
if (!fragmentShaderSource && !(cached && cached.glsl)) {
  throw new Error(`Missing shader source for key ${fragmentShaderKey}; preload it`);
}

Type guard

function shaderResolvable(key, source, game) {
  return typeof source === 'string' && source.length > 0 || (game.cache.shader.has(key) && Boolean(game.cache.shader.get(key).glsl));
}

Prevention

When it happens

Trigger: Constructing a BaseFilterShader (or subclass) with fragmentShaderSource = null/undefined and a fragmentShaderKey that was never loaded into the game shader cache; misspelling the key; loading the GLSL under a different key than the one passed; the cache entry existing but missing a .glsl property.

Common situations: Writing a custom WebGL filter and forgetting to preload the GLSL via the loader; renaming a shader asset but not updating the filter's key; using a pack/plugin that references a shader it didn't bundle; cache eviction or a load that failed silently.

Related errors


AI-assisted analysis of phaserjs/phaser@41be1e462b (2026-08-13). Data as JSON: /api/errors/02676049f0fc1027. Report an issue: GitHub.