potree
Version:
WebGL point cloud viewer - WORK IN PROGRESS
79 lines (58 loc) • 1.66 kB
JavaScript
Potree.GLProgram = class GLProgram {
constructor (gl, material) {
this.gl = gl;
this.material = material;
this.program = gl.createProgram(); ;
this.recompile();
}
compileShader (type, source) {
let gl = this.gl;
let vs = gl.createShader(type);
gl.shaderSource(vs, source);
gl.compileShader(vs);
let success = gl.getShaderParameter(vs, gl.COMPILE_STATUS);
if (!success) {
console.error('could not compile shader:');
let log = gl.getShaderInfoLog(vs);
console.error(log, source);
return null;
}
return vs;
}
recompile () {
let gl = this.gl;
let vs = this.compileShader(gl.VERTEX_SHADER, this.material.vertexShader);
let fs = this.compileShader(gl.FRAGMENT_SHADER, this.material.fragmentShader);
if (vs === null || fs === null) {
return;
}
// PROGRAM
let program = this.program;
gl.attachShader(program, vs);
gl.attachShader(program, fs);
gl.linkProgram(program);
let success = gl.getProgramParameter(program, gl.LINK_STATUS);
if (!success) {
console.error('could not compile/link program:');
console.error(this.material.vertexShader);
console.error(this.material.fragmentShader);
return;
}
gl.detachShader(program, vs);
gl.detachShader(program, fs);
gl.deleteShader(vs);
gl.deleteShader(fs);
gl.useProgram(program);
{ // UNIFORMS
let uniforms = {};
let n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for (let i = 0; i < n; i++) {
var uniform = gl.getActiveUniform(program, i);
var name = uniform.name;
var loc = gl.getUniformLocation(program, name);
uniforms[name] = loc;
}
this.uniforms = uniforms;
}
}
};