{"record":{"id":"02676049f0fc1027","repo":"phaserjs/phaser","slug":"basefiltershader-no-fragment-shader-source-provid","errorCode":null,"errorMessage":"BaseFilterShader: No fragment shader source provided and no shader found with key ","messagePattern":"BaseFilterShader: No fragment shader source provided and no shader found with key ","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/renderer/webgl/renderNodes/filters/BaseFilterShader.js","lineNumber":57,"sourceCode":" * @constructor\n * @since 4.0.0\n * @param {string} name - The name of the filter.\n * @param {Phaser.Renderer.WebGL.RenderNodes.RenderNodeManager} manager - The manager that owns this filter.\n * @param {string} [fragmentShaderKey] - The key of the fragment shader source in the shader cache. This will only be used if `fragmentShaderSource` is not set.\n * @param {string} [fragmentShaderSource] - The fragment shader source.\n * @param {?Phaser.Types.Renderer.WebGL.ShaderAdditionConfig[]} [shaderAdditions] - An array of shader additions to apply to the shader program.\n */\nvar BaseFilterShader = new Class({\n    Extends: BaseFilter,\n\n    initialize: function BaseFilterShader (name, manager, fragmentShaderKey, fragmentShaderSource, shaderAdditions)\n    {\n        if (!fragmentShaderSource)\n        {\n            var baseShader = manager.renderer.game.cache.shader.get(fragmentShaderKey);\n            if (!(baseShader && baseShader.glsl))\n            {\n                throw new Error('BaseFilterShader: No fragment shader source provided and no shader found with key ' + fragmentShaderKey);\n            }\n            fragmentShaderSource = baseShader.glsl;\n        }\n\n        BaseFilter.call(this, name, manager);\n\n        var renderer = manager.renderer;\n        var gl = renderer.gl;\n\n        var config = {\n            name: name,\n            shaderName: name,\n            vertexSource: SimpleTextureVert,\n            fragmentSource: fragmentShaderSource,\n            shaderAdditions: shaderAdditions || [],\n            vertexBufferLayout: {\n                usage: 'DYNAMIC_DRAW',\n                count: 4,","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/phaserjs/phaser/blob/41be1e462bc600064e498cba370bfa8c5c055a22/src/renderer/webgl/renderNodes/filters/BaseFilterShader.js#L39-L75","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nnew CustomFilter(manager, 'myFilter'); // source missing, key not loaded\n\n// after\nthis.load.shader('myFilter', 'assets/shaders/myFilter.frag');\n// then in create:\nnew CustomFilter(manager, 'myFilter');","handlingStrategy":"validation","validationCode":"const cached = game.cache.shader.get(fragmentShaderKey);\nif (!fragmentShaderSource && !(cached && cached.glsl)) {\n  throw new Error(`Missing shader source for key ${fragmentShaderKey}; preload it`);\n}","typeGuard":"function shaderResolvable(key, source, game) {\n  return typeof source === 'string' && source.length > 0 || (game.cache.shader.has(key) && Boolean(game.cache.shader.get(key).glsl));\n}","tryCatchPattern":null,"preventionTips":["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."],"tags":["renderer","webgl","shader","filter","cache","phaser4"],"backgroundTag":null,"analyzedSha":"41be1e462bc600064e498cba370bfa8c5c055a22","analyzedAt":"2026-08-13T04:23:39.729Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}