UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

45 lines (44 loc) 1.83 kB
import { BINDGROUP_VIEW, bindGroupNames, uniformTypeToName } from "../constants.js"; import { ShaderProcessorGLSL } from "../shader-processor-glsl.js"; class WebglShaderProcessorGLSL extends ShaderProcessorGLSL { static run(device, shaderDefinition, shader) { const vertexExtracted = WebglShaderProcessorGLSL.extract(shaderDefinition.vshader, true); const fragmentExtracted = WebglShaderProcessorGLSL.extract(shaderDefinition.fshader, true); const concatUniforms = vertexExtracted.uniforms.concat(fragmentExtracted.uniforms); const uniforms = Array.from(new Set(concatUniforms)); const parsedUniforms = WebglShaderProcessorGLSL.parseUniformLines(uniforms, shader); const code = WebglShaderProcessorGLSL.processUniformsGL2(parsedUniforms, shaderDefinition.processingOptions); const vshader = vertexExtracted.src.replace(ShaderProcessorGLSL.MARKER, code); const fshader = fragmentExtracted.src.replace(ShaderProcessorGLSL.MARKER, code); return { vshader, fshader }; } static processUniformsGL2(uniforms, processingOptions) { let code = ""; const viewFormat = processingOptions.uniformFormats[BINDGROUP_VIEW]; if (viewFormat) { code += WebglShaderProcessorGLSL.getUniformShaderDeclarationGL2(viewFormat, BINDGROUP_VIEW); } uniforms.forEach((uniform) => { if (!processingOptions.hasUniform(uniform.name)) { code += `uniform ${uniform.line}; `; } }); return code; } static getUniformShaderDeclarationGL2(format, bindGroup) { const name = bindGroupNames[bindGroup]; let code = `layout(std140) uniform ub_${name} { `; format.uniforms.forEach((uniform) => { const typeString = uniformTypeToName[uniform.type]; code += ` ${typeString} ${uniform.shortName}${uniform.count ? `[${uniform.count}]` : ""}; `; }); return `${code}}; `; } } export { WebglShaderProcessorGLSL };