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");
}
Thursday, April 5, 2012
[VolumetricLighting] multiple programs
Each shaderProgram can only have one vertex shader and one fragment shader. What if we want to use different shader to shade different part of our view? Or in our volumetric lighting case, we want to enable different fragment shaders for different passes. I was inspired by the last assignment of CIS565 where we wrote a post-process image processing library. We can switch to different shaderPrograms according to the pressedkey. So for my volumetric lighting project, I initiated a bunch of different shaderProgram (all links to the same vertex shader but different fragment shaders), and switched to the proper one before drawing each pass.
No comments:
Post a Comment