Demos (Fixed a glitch. Now you can view them in both firefox and chrome):
Report:
Video: http://dl.dropbox.com/u/
Download code here.
1: var blackFramebuffer = gl.createFramebuffer();
2: gl.bindFramebuffer(gl.FRAMEBUFFER, blackFramebuffer);
3: blackFramebuffer.width = 512;
4: blackFramebuffer.height = 512;
5: blackTexture = gl.createTexture();
6: gl.bindTexture(gl.TEXTURE_2D, blackTexture);
7: gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
8: gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
9: gl.generateMipmap(gl.TEXTURE_2D);
10: gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, blackFramebuffer.width, blackFramebuffer.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
11: var renderbuffer0 = gl.createRenderbuffer();
12: gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer0);
13: gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, blackFramebuffer.width, blackFramebuffer.height);
14: gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, blackTexture, 0);
15: gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbuffer0);
16: gl.bindTexture(gl.TEXTURE_2D, null);
17: gl.bindRenderbuffer(gl.RENDERBUFFER, null);
18: gl.bindFramebuffer(gl.FRAMEBUFFER, null);
Then in the beginning of my draw() function, we add the following:
gl.bindFramebuffer(gl.FRAMEBUFFER, blackFramebuffer);
And after calling gl.drawElements() in my draw() function, we add the following:
gl.bindTexture(gl.TEXTURE_2D, blackTexture);
gl.generateMipmap(gl.TEXTURE_2D);
gl.bindTexture(gl.TEXTURE_2D, null);
function createProgram(fragmentShaderID, vertexShaderID) {
var fragmentShader = getShader(gl, fragmentShaderID);
var vertexShader = getShader(gl, vertexShaderID);
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
alert("Could not initialise shaders");
}
program.vertexPositionAttribute = gl.getAttribLocation(program, "aVertexPosition");
gl.enableVertexAttribArray(program.vertexPositionAttribute);
program.vertexNormalAttribute = gl.getAttribLocation(program, "aVertexNormal");
gl.enableVertexAttribArray(program.vertexNormalAttribute);
program.textureCoordAttribute = gl.getAttribLocation(program, "aTextureCoord");
gl.enableVertexAttribArray(program.textureCoordAttribute);
program.samplerUniform = gl.getUniformLocation(program, "uSampler");
program.pMatrixUniform = gl.getUniformLocation(program, "uPMatrix");
program.mvMatrixUniform = gl.getUniformLocation(program, "uMVMatrix");
return program;
}
var currentProgram;
var regProgram;
var postProgram;
var blendProgram;
var occProgram;
function initShaders() {
regProgram = createProgram("reg-fs", "vs");
regProgram.drawblackUniform = gl.getUniformLocation(regProgram, "drawblack");
postProgram = createProgram("post-process-fs", "vs");
occProgram = createProgram("occlusion-fs", "vs");
occProgram.maskUniform = gl.getUniformLocation(occProgram, "mask");
blendProgram = createProgram("blend-fs", "vs");
blendProgram.maskUniform = gl.getUniformLocation(blendProgram, "mask");
}
function loadModel() {
var request = new XMLHttpRequest();
request.open("GET", "model.json");
request.onreadystatechange = function() {
if (request.readyState == 4) {
handleLoadedModel(JSON.parse(request.responseText));
}
}
request.send();
}
The above lines create a new XMLHttpRequest (comment: Chrome isn't happy with local request and keeps giving an "Cross origin requests are only supported for HTTP" error message.) and use it to load the file Teapot.json, and trigger an action that will convert the JSON text into the data we can use:
1: var modelVertexPositionBuffer;
2: var modelVertexNormalBuffer;
3: var modelVertexTextureCoordBuffer;
4: var modelVertexIndexBuffer;
5: function handleLoadedModel(modelData) {
6: modelVertexNormalBuffer = gl.createBuffer();
7: gl.bindBuffer(gl.ARRAY_BUFFER, modelVertexNormalBuffer);
8: gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(modelData.vertexNormals), gl.STATIC_DRAW);
9: modelVertexNormalBuffer.itemSize = 3;
10: modelVertexNormalBuffer.numItems = modelData.vertexNormals.length / 3;
11: modelVertexTextureCoordBuffer = gl.createBuffer();
12: gl.bindBuffer(gl.ARRAY_BUFFER, modelVertexTextureCoordBuffer);
13: gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(modelData.vertexTextureCoords), gl.STATIC_DRAW);
14: modelVertexTextureCoordBuffer.itemSize = 2;
15: modelVertexTextureCoordBuffer.numItems = modelData.vertexTextureCoords.length / 2;
16: modelVertexPositionBuffer = gl.createBuffer();
17: gl.bindBuffer(gl.ARRAY_BUFFER, modelVertexPositionBuffer);
18: gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(modelData.vertexPositions), gl.STATIC_DRAW);
19: modelVertexPositionBuffer.itemSize = 3;
20: modelVertexPositionBuffer.numItems = modelData.vertexPositions.length / 3;
21: modelVertexIndexBuffer = gl.createBuffer();
22: gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, modelVertexIndexBuffer);
23: gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(modelData.indices), gl.STREAM_DRAW);
24: modelVertexIndexBuffer.itemSize = 1;
25: modelVertexIndexBuffer.numItems = modelData.indices.length;
26: }
So I'm searching for a method to convert obj to json. Attached is a python script that will do the job for us!python obj2json.py gear.obj > gear.json