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
- Preload the shader GLSL with this.load.shader() (or the appropriate loader) using the exact key the filter references.
- Pass fragmentShaderSource directly as a string if you do not want to use the cache.
- Verify the cache: game.cache.shader.has(fragmentShaderKey) and that the entry's .glsl is a non-empty string.
- 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
- Preload all GLSL via this.load.shader before creating filters.
- Keep a registry of shader keys your filters depend on.
- Verify game.cache.shader.has(key) after preload.
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
- Vertex Shader failed:
- Fragment Shader failed:
- Link Shader failed:
- BatchHandler must have a name
- BatchHandlerStrip: Vertex count exceeds maximum per batch (
AI-assisted analysis of phaserjs/phaser@41be1e462b (2026-08-13).
Data as JSON: /api/errors/02676049f0fc1027.
Report an issue: GitHub.