Tarek Sherif
BioDigital
// App manages global GL state
var app = PicoGL.createApp(canvas)
.clearColor(0.0, 0.0, 0.0, 1.0);
// Program, VBO, VAO
var program = app.createProgram(vertexShaderSource, fragmentShaderSource);
var positions = app.createVertexBuffer(PicoGL.FLOAT, 2, positionData);
var vertexArray = app.createVertexArray()
.vertexAttributeBuffer(0, positions);
// Draw call manages per-draw state
var drawCall = app.createDrawCall(program, vertexArray);
app.clear();
drawCall.draw();
gl.bindVertexArray(vertexArray);
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);
gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);
gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(1);
gl.bindVertexArray(null);
function draw() {
gl.bindVertexArray(vertexArray);
gl.drawArrays(gl.TRIANGLES, 0, numVertices);
requestAnimationFrame(draw);
}
var vertexArray = app.createVertexArray()
.vertexAttributeBuffer(0, positionBuffer)
.vertexAttributeBuffer(1, normalBuffer);
app.createDrawCall(program, vertexArray);
function draw() {
drawCall.draw()
requestAnimationFrame(draw);
}
var uniformsLocation = gl.getUniformBlockIndex(program, "myUniforms");
gl.uniformBlockBinding(program, uniformsLocation, 0);
// HAVE TO KNOW STD140 LAYOUT!!!
var uboData = new Float32Array(24);
uboData.set(viewProjMatrix);
uboData.set(eyePosition, 16);
uboData.set(lightPosition, 20);
var uniformBuffer = gl.createBuffer();
gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, uniformBuffer);
gl.bufferData(gl.UNIFORM_BUFFER, uboData, gl.STATIC_DRAW);
// PicoGL.js handles layout.
var uniformBuffer = app.createUniformBuffer([
PicoGL.FLOAT_MAT4,
PicoGL.FLOAT_VEC4,
PicoGL.FLOAT_VEC4
])
.set(0, viewProjMatrix)
.set(1, eyePosition)
.set(2, lightPosition)
.update();
drawCall.uniformBlock("myUniforms", uniformBuffer);
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.transformFeedbackVaryings(program, ["vPosition"], gl.SEPARATE_ATTRIBS);
gl.linkProgram(program);
var positionBufferA = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBufferA);
gl.bufferData(gl.ARRAY_BUFFER, positionData, gl.STREAM_COPY);
var positionBufferB = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBufferB);
gl.bufferData(gl.ARRAY_BUFFER, positionData.byteLength, gl.STREAM_COPY);
gl.bindBuffer(gl.ARRAY_BUFFER, positionBufferA);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);
gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, 0, positionBufferB);
gl.beginTransformFeedback(gl.TRIANGLES);
gl.drawArrays(gl.TRIANGLES, 0, numVertices);
gl.endTransformFeedback();
var program = app.createProgram(vertexShader, fragmentShader, ["vPosition"]);
var positionBufferA = app.createVertexBuffer(PicoGL.FLOAT, 3, positionData);
var positionBufferB = app.createVertexBuffer(PicoGL.FLOAT, 3, positionData.length);
var vertexArray = app.createVertexArray()
.vertexAttributeBuffer(0, positionBufferA)
var transformFeedback = app.createTransformFeedback()
.feedbackBuffer(0, positionBufferB);
var drawCall = app.createDrawCall(program, vertexArray)
.transformFeedback(transformFeedback);
drawCall.draw();
var positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, positionData, gl.STATIC_DRAW);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);
var colorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, colorData, gl.STATIC_DRAW);
gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(1);
gl.vertexAttribDivisor(1, 1);
gl.drawArraysInstanced(gl.TRIANGLES, 0, numVertices, numInstances);
var positionBuffer = app.createVertexBuffer(PicoGL.FLOAT, 3, positionData);
var colorBuffer = app.createVertexBuffer(PicoGL.FLOAT, 3, colorData);
var vertexArray = app.createVertexArray()
.vertexAttributeBuffer(0, positionBuffer)
.instanceAttributeBuffer(1, colorBuffer);
var drawCall = app.createDrawCall(program, vertexArray);
drawCall.draw();
var framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
var target1 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, target1);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, gl.drawingBufferWidth, gl.drawingBufferHeight);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target1, 0);
var target2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, target2);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGBA8, gl.drawingBufferWidth, gl.drawingBufferHeight);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, target2, 0);
gl.drawBuffers([
gl.COLOR_ATTACHMENT0,
gl.COLOR_ATTACHMENT1
]);
var framebuffer = app.createFramebuffer()
.colorTarget(0)
.colorTarget(1);