diff --git a/packages/core/src/shader/Shader.ts b/packages/core/src/shader/Shader.ts index d0eb13185..205ff12e7 100644 --- a/packages/core/src/shader/Shader.ts +++ b/packages/core/src/shader/Shader.ts @@ -89,6 +89,9 @@ export class Shader { } const shaderInfo = Shader._shaderLab.parseShader(nameOrShaderSource); + if (shaderMap[shaderInfo.name]) { + throw `Shader named "${shaderInfo.name}" already exists.`; + } const subShaderList = shaderInfo.subShaders.map((subShaderInfo) => { const passList = subShaderInfo.passes.map((passInfo) => { if (typeof passInfo === "string") { diff --git a/tests/src/shader-lab/ShaderLab.test.ts b/tests/src/shader-lab/ShaderLab.test.ts index d08e8633d..6fa48d961 100644 --- a/tests/src/shader-lab/ShaderLab.test.ts +++ b/tests/src/shader-lab/ShaderLab.test.ts @@ -3,6 +3,7 @@ import { IShaderPassInfo, ISubShaderInfo } from "@galacean/engine-design"; import { Color } from "@galacean/engine-math"; import { ShaderLab } from "@galacean/engine-shader-lab"; import { glslValidate } from "./ShaderValidate"; +import { Shader } from "@galacean/engine-core"; import chai, { expect } from "chai"; import spies from "chai-spies"; @@ -215,4 +216,11 @@ describe("ShaderLab", () => { const demoShader = fs.readFileSync(path.join(__dirname, "shaders/glass.shader")).toString(); glslValidate(demoShader, shaderLab); }); + + it("shader with duplicate name", () => { + const demoShader = fs.readFileSync(path.join(__dirname, "shaders/glass.shader")).toString(); + (Shader as any)._shaderLab = shaderLab; + expect(Shader.create(demoShader) instanceof Shader).to.be.true; + expect(Shader.create.bind(null, demoShader)).to.throw('Shader named "Gem" already exists.'); + }); });