程序无效且属性设置不正确

时间:2014-01-25 18:42:52

标签: javascript webgl

这是我初始化程序的代码;

function initializeProgram() {
    vertexShader = util.createShader(gl.VERTEX_SHADER, vertexShaderSource);
    fragmentShader = util.createShader(gl.FRAGMENT_SHADER, fragmentShaderSource);
    shaderList = [vertexShader, fragmentShader];

    shaderProgram = util.createProgram(shaderList);
}

这是我的循环;

function loop() {
    gl.clearColor(1.0, 1.0, 1.0, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);

    gl.useProgram(shaderProgram);

    gl.bindBuffer(gl.ARRAY_BUFFER, positionBufferObject);
    gl.enableVertexAttribArray(0);
    gl.vertexAttribPointer(0, 4, gl.FLOAT, gl.FALSE, 0, 0);

    gl.drawArrays(gl.TRIANGLES, 0, 3);

    gl.disableVertexAttribArray(0);
}

我在这里遇到的问题是两点错误;

gl.useProgram(shaderProgram); // WebGL: INVALID_OPERATION: useProgram: program not valid

gl.drawArrays(gl.TRIANGLES, 0, 3); // WebGL: INVALID_OPERATION: drawArrays: attribs not setup correctly

我不确定为什么我会收到这些警告,我一直在尝试将C OpenGL移植到WebGL,因此我的主要猜测是存在命名/参数差异

完整代码位于;

script.js - http://pastebin.com/zYyQY3Bi util.js - http://pastebin.com/ihEFQxaB

2 个答案:

答案 0 :(得分:2)

gl.useProgram(shaderProgram); 
// WebGL: INVALID_OPERATION: useProgram: program not valid 

很可能意味着着色器无法编译,因为它们有错误。您可以使用

获取错误
gl.getShaderInfoLog(shader)

也可能

gl.getProgramInfoLog(program);

他们每个都返回一个字符串,所以像这样的东西是常见的

if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) (
    console.log(gl.getShaderInfoLog(shader));
    // exit? alert?
}

答案 1 :(得分:0)

    WebGL不支持
  • layout关键字(仅支持OpenGL ES2,不支持桌面OpenGL / GLSL)。您需要将其删除才能使着色器进行编译。

  • 该程序尚未编译或链接(致电compileShaderlinkProgram)。显示流量的简单代码段位于http://www.gpupowered.org/sand2/launch2/programs.js