Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么此WebGL着色器类型无效?_Javascript_Html_Canvas_Opengl Es_Webgl - Fatal编程技术网

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

Javascript 为什么此WebGL着色器类型无效?,javascript,html,canvas,opengl-es,webgl,Javascript,Html,Canvas,Opengl Es,Webgl,免责声明:我今天才开始使用WebGL 我试图用WebGL上下文代替“标准”2d上下文在HTML5画布上绘制一些基本内容 我正在使用developer.Mozilla.org WebGL文档作为参考,并且已经开始处理一些代码 我发现渲染“clipspace”坐标需要顶点着色器,渲染被渲染像素的颜色需要片段着色器。根据WebGL wikipedia页面,着色器似乎是直接用GLSL编码的,GLSL是C的高级方言。在Mozilla文档中,这些代码是用JavaScript字符串化的,但有很多方法可以做到这

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

我试图用WebGL上下文代替“标准”2d上下文在HTML5画布上绘制一些基本内容

我正在使用developer.Mozilla.org WebGL文档作为参考,并且已经开始处理一些代码

我发现渲染“clipspace”坐标需要顶点着色器,渲染被渲染像素的颜色需要片段着色器。根据WebGL wikipedia页面,着色器似乎是直接用GLSL编码的,GLSL是C的高级方言。在Mozilla文档中,这些代码是用JavaScript字符串化的,但有很多方法可以做到这一点

这是我到目前为止的代码,但是我遇到的错误与画布的WebGL上下文的
VERTEX_着色器
enum有关,无法识别,并且看到上下文的文档和原型有这样一个enum,我想知道是什么导致了这个错误,或者为什么我看到这个错误

代码如下,谢谢您的帮助

<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>

webgl尝试
var canvas=document.getElementById(“canvas”);
var gl=canvas.getContext(“webgl”);
函数createShader(gl、源代码、类型){
var shader=gl.createShader(类型);
gl.shaderSource(着色器,源代码);
gl.compileShader(着色器);
if(!gl.getShaderParameter(着色器,gl.COMPILE_状态)){
var info=gl.getShaderInfoLog(着色器);
throw“无法编译web gl着色器。\n\n”+信息;
}
}
var vertexShaderSource=
“属性vec4位置;\n”
“void main(){\n”+
“gl\U位置=位置;\n”+
“}\n”;
var fragmentShaderSource=
“void main(){\n”+
“gl_FragColor=vec4(1.0,1.0,1.0,1.0);\n”+
“}\n”;
/*
*创建程序
*/
var program=gl.createProgram();
//尝试访问顶点_着色器枚举:WebGL:
//**无效的枚举:createShader:无效的着色器类型**
var vertexShader=gl.createShader(gl,vertexShaderSource,gl.VERTEX_着色器);
var fragmentShader=gl.createShader(gl,fragmentShaderSource,gl.FRAGMENT\u着色器);
//附加预先存在的着色器
gl.attachShader(程序,顶点着色器);
gl.attachShader(程序、碎片着色器);
总账链接程序(程序);
if(!gl.getProgramParameter(程序、总账链接状态)){
var info=gl.getProgramInfoLog(程序);
throw“无法编译WebGL程序。\n\n”+信息;
}

您的代码包含语义错误

应该是

var vertexShader = createShader(gl, vertexShaderSource, gl.VERTEX_SHADER);
var fragmentShader = createShader(gl, fragmentShaderSource, gl.FRAGMENT_SHADER);
因为您正在调用上面的
createShader
函数,而不是webgl上下文的方法

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中的
+

谢谢!在使用api时,我似乎在语义上搞砸了,我不知道为什么。我想这是因为我觉得我只是把一个拼图拼凑起来,而不是编写代码,而且我通常不喜欢检查别人的代码。