WebGL:在着色器之间切换

时间:2013-05-08 08:45:11

标签: webgl shader

我写了一个很小的功能来在着色器之间切换,但不幸的是它不起作用。 我创建着色器并将它们作为着色器对象返回。

  1. program = gl.createProgram(vs,fs,“VertexPosition”,“TextureCoord”,“VertexNormal”);

  2. depthprogram = gl.createProgram(vs,fs,“VertexPosition”,false,false);

  3. 我在更新功能中使用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);
    

1 个答案:

答案 0 :(得分:0)

这两个着色器是否使用相同的属性? 据我所知,你的代码首先使用着色器:

attribute vertexPos;
attribute vertexNormal;
attribute textureCoord;

而第二次仅使用

attribute vertexPos;

如果您尝试发送未在程序的顶点着色器中使用的属性,或者您没有发送顶点着色器请求的属性,那么您将收到警告。 我会说你没有为第一个着色器发送vertexNormal和textureCoord,虽然着色器需要它们。

希望这有帮助。