UNPKG

@pixi/core

Version:
53 lines (50 loc) 2.27 kB
import { GLProgram } from '../GLProgram.mjs'; import { compileShader } from './compileShader.mjs'; import { defaultValue } from './defaultValue.mjs'; import { getAttributeData } from './getAttributeData.mjs'; import { getUniformData } from './getUniformData.mjs'; import { logProgramError } from './logProgramError.mjs'; function generateProgram(gl, program) { const glVertShader = compileShader(gl, gl.VERTEX_SHADER, program.vertexSrc); const glFragShader = compileShader(gl, gl.FRAGMENT_SHADER, program.fragmentSrc); const webGLProgram = gl.createProgram(); gl.attachShader(webGLProgram, glVertShader); gl.attachShader(webGLProgram, glFragShader); const transformFeedbackVaryings = program.extra?.transformFeedbackVaryings; if (transformFeedbackVaryings) { if (typeof gl.transformFeedbackVaryings !== "function") { console.warn(`TransformFeedback is not supported but TransformFeedbackVaryings are given.`); } else { gl.transformFeedbackVaryings(webGLProgram, transformFeedbackVaryings.names, transformFeedbackVaryings.bufferMode === "separate" ? gl.SEPARATE_ATTRIBS : gl.INTERLEAVED_ATTRIBS); } } gl.linkProgram(webGLProgram); if (!gl.getProgramParameter(webGLProgram, gl.LINK_STATUS)) { logProgramError(gl, webGLProgram, glVertShader, glFragShader); } program.attributeData = getAttributeData(webGLProgram, gl); program.uniformData = getUniformData(webGLProgram, gl); if (!/^[ \t]*#[ \t]*version[ \t]+300[ \t]+es[ \t]*$/m.test(program.vertexSrc)) { const keys = Object.keys(program.attributeData); keys.sort((a, b) => a > b ? 1 : -1); for (let i = 0; i < keys.length; i++) { program.attributeData[keys[i]].location = i; gl.bindAttribLocation(webGLProgram, i, keys[i]); } gl.linkProgram(webGLProgram); } gl.deleteShader(glVertShader); gl.deleteShader(glFragShader); const uniformData = {}; for (const i in program.uniformData) { const data = program.uniformData[i]; uniformData[i] = { location: gl.getUniformLocation(webGLProgram, i), value: defaultValue(data.type, data.size) }; } const glProgram = new GLProgram(webGLProgram, uniformData); return glProgram; } export { generateProgram }; //# sourceMappingURL=generateProgram.mjs.map