我已经阅读了有关此问题的以前的一篇StackOverflow文章,并且仍然在让两个不同的着色器集合在一个WebGL程序中正常工作时遇到问题。WebGL多重着色器
下面是代码的骨架框架。我有两套独立的着色器,使用不同的变量名称来防止交叉污染。我创建了两个initShader()函数,每个着色器集合一个,然后调用initBuffers()和draw()函数。结果是只有第二个着色器才生效,并且只显示了使用该着色器绘制的项目,尽管着色器在drawscene()中被单独标识和调用。
有关如何解决此问题的任何建议将不胜感激。
Declare: vertexShaderA
Declare: fragmentShaderA
Declare: vertexShaderB (use distinct variable names to that of vertexShaderA)
Declare: fragmentShaderB (use distinct variable names to that of fragmentShaderA)
// main script
initShadersA(){
…
gl.useProgram(shaderProgramA);
…
}
initShadersB(){
…
gl.useProgram(shaderProgramB);
…
}
…
setMatrixUniformsA();
setMatrixUniformsB();
function initBuffers(){
…
}
function drawScene(){
…
gl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffer);
gl.vertexAttribPointer(shaderProgramA.vertexPositionAttributeA, vertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
…
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vertexIndexBuffer);
gl.uniform1i(shaderProgramA.samplerUniform, 0);
setMatrixUniformsA();
gl.drawElements(gl.TRIANGLES, vertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
…
gl.bindBuffer(gl.ARRAY_BUFFER, vertexPositionBuffer);
gl.vertexAttribPointer(shaderProgramB.vertexPositionAttributeB, vertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
…
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, vertexIndexBuffer);
gl.uniform1i(shaderProgramB.samplerUniform, 0);
setMatrixUniformsB();
gl.drawElements(gl.TRIANGLES, vertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
}
function draw() {
requestAnimFrame(draw);
animate();
drawScene();
}
function animate() {
…
}
function webGLStart() {
initGL(canvas);
initShadersA();
initShadersB();
initBuffers();
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.enable(gl.DEPTH_TEST);
draw();
}
[您可能会发现这有帮助](http://webglfundamentals.org/webgl/lessons/webgl-drawing-multiple-things.html)? – gman 2015-03-31 05:14:53