为什么此WebGL着色器类型无效?

时间:2016-06-14 15:50:19

标签: javascript html5 canvas opengl-es webgl

免责声明:我今天刚开始使用WebGL。

我试图使用WebGL上下文在HTML5画布上绘制一些基本内容,而不是"标准" 2d上下文。

我使用developer.Mozilla.org WebGL文档作为参考,并开始搞乱一些代码。

我已经发现顶点着色器是渲染"剪辑空间"坐标和片段着色器是渲染像素的颜色所必需的。根据WebGL维基百科页面,似乎着色器直接在GLSL中编码,GLSL是C语言的高级方言。在Mozilla文档中,这些代码用JavaScript进行字符串化,但有很多方法可以做到......

这是我到目前为止的代码,但我遇到的错误与画布的VERTEX_SHADER枚举有关。 WebGL上下文无法识别,并且看到上下文的文档和原型具有这样的枚举,我想知道导致此错误的原因或我看到此错误的原因。

代码如下,感谢您的帮助。

<html>
<head>
    <title>webgl try</title>
</head>
<body>
<canvas width="600" height="400" id="canvas" style="border: 1px dotted;"> </canvas>

<script>
    var canvas = document.getElementById("canvas");
    var gl = canvas.getContext("webgl");

    function createShader (gl, sourceCode, type) {
      var shader = gl.createShader(type);
      gl.shaderSource(shader, sourceCode);
      gl.compileShader(shader);

      if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
        var info = gl.getShaderInfoLog(shader);
        throw "could not compile web gl shader. \n\n" + info;
      }
    }

    var vertexShaderSource =
      "attribute vec4 position;\n"
      "void main() {\n"+
      "  gl_Position = position;\n"+
      "}\n";

    var fragmentShaderSource =
      "void main() {\n"+
      "  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"+
      "}\n";

    /*
     * create program
     */

    var program = gl.createProgram();

    // ERROR COMES ON THIS LINE WHEN ATTEMPTING TO ACCESS THE VERTEX_SHADER ENUM: WebGL: 
    // **INVALID_ENUM: createShader: invalid shader type**
    var vertexShader = gl.createShader(gl, vertexShaderSource, gl.VERTEX_SHADER);
    var fragmentShader = gl.createShader(gl, fragmentShaderSource, gl.FRAGMENT_SHADER);

    // Attach pre-existing shaders
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);

    gl.linkProgram(program);

    if ( !gl.getProgramParameter( program, gl.LINK_STATUS) ) {
       var info = gl.getProgramInfoLog(program);
       throw "Could not compile WebGL program. \n\n" + info;
    }
</script>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

您的代码包含语义错误。

应该是

var vertexShader = createShader(gl, vertexShaderSource, gl.VERTEX_SHADER);
var fragmentShader = createShader(gl, fragmentShaderSource, gl.FRAGMENT_SHADER);

因为您正在调用上面的createShader函数而不是webgl-context的方法。

您的createShader应该返回它创建的着色器:

function createShader (gl, sourceCode, type) {
    var shader = gl.createShader(type);
    gl.shaderSource(shader, sourceCode);
    gl.compileShader(shader);

    if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
        var info = gl.getShaderInfoLog(shader);
        throw "could not compile web gl shader. \n\n" + info;
    }

    return shader;
}

您还错过了vertexShaderSrc中的+