我写了一个很小的功能来在着色器之间切换,但不幸的是它不起作用。 我创建着色器并将它们作为着色器对象返回。
program = gl.createProgram(vs,fs,“VertexPosition”,“TextureCoord”,“VertexNormal”);
depthprogram = gl.createProgram(vs,fs,“VertexPosition”,false,false);
我在更新功能中使用switch功能,包括:
function Update(){
gl.switchProgram(program);
gl.Draw(Teapot, cam);
};
模型的所有缓冲区都在绘制函数中绑定,(参数:模型,摄像机位置)
this.switchProgram = function(program){
if (this.program !== program){
this.lastprogram = this.program;
this.program = program;
gl.useProgram(this.program);
};
};
以下是生成的错误:WebGL:INVALID_OPERATION:drawElements:attribs未正确设置 如果我评论一切正常,但我无法切换:(
depthprogram = gl.createProgram(vs, fs, "VertexPosition", false, false);
gl.switchProgram(program);
答案 0 :(得分:0)
这两个着色器是否使用相同的属性? 据我所知,你的代码首先使用着色器:
attribute vertexPos;
attribute vertexNormal;
attribute textureCoord;
而第二次仅使用
attribute vertexPos;
如果您尝试发送未在程序的顶点着色器中使用的属性,或者您没有发送顶点着色器请求的属性,那么您将收到警告。 我会说你没有为第一个着色器发送vertexNormal和textureCoord,虽然着色器需要它们。
希望这有帮助。