这是我初始化程序的代码;
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
答案 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)
layout
关键字(仅支持OpenGL ES2,不支持桌面OpenGL / GLSL)。您需要将其删除才能使着色器进行编译。
该程序尚未编译或链接(致电compileShader
,linkProgram
)。显示流量的简单代码段位于http://www.gpupowered.org/sand2/launch2/programs.js