playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
45 lines (44 loc) • 1.83 kB
JavaScript
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
};