【问题标题】:WebGL: INVALID_VALUE: attachShader: no object or object deleted. Is this secretly helpful?WebGL:INVALID_VALUE:attachShader:没有对象或对象被删除。这暗地里有用吗?
【发布时间】:2013-02-01 07:31:05
【问题描述】:

我开始接触 WebGL,我想知道是否有一个了解错误输出的好地方。

我不断收到以下错误

WebGL: INVALID_VALUE: attachShader: no object or object deleted localhost:1   
WebGL: INVALID_OPERATION: getAttribLocation: program not linked localhost:1
WebGL: INVALID_OPERATION: getUniformLocation: program not linked localhost:1
WebGL: INVALID_OPERATION: useProgram: program not valid localhost:1
WebGL: INVALID_OPERATION: drawElements: attribs not setup correctly 

所以,我可以从这些错误中看出我的着色器无法正常工作

gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);

随后的错误是关于没有程序。

所以我的问题是:如何找出我的代码出了什么问题?

程序没有以某种方式定义,我确实有var program = gl.createProgram();。那么,为什么会发生这种情况?我在哪里看?我猜这是因为我的着色器无法编译,但据我所知,我的着色器有 0 个错误或警告。它被上述代码/警告混淆了......此外,chrome提到了这些警告,而firefox没有。两者都不能初始化着色器

【问题讨论】:

  • 您是否检查过您的着色器是否已编译?致电gl.compileShader 后,请致电gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)。如果返回 false,则您的着色器中存在错误,这可能会阻止 WebGL 继续设置您的程序。
  • 是的,着色器正在编译。虽然它没有链接

标签: javascript opengl-es webgl shader vertex-shader


【解决方案1】:

我建议using some boilerplate code 编译您的着色器和链接程序

对于着色器

/**
 * Creates and compiles a shader.
 *
 * @param {!WebGLRenderingContext} gl The WebGL Context.
 * @param {string} shaderSource The GLSL source code for the shader.
 * @param {number} shaderType The type of shader, VERTEX_SHADER or
 *     FRAGMENT_SHADER.
 * @return {!WebGLShader} The shader.
 */
function compileShader(gl, shaderSource, shaderType) {
  // Create the shader object
  var shader = gl.createShader(shaderType);

  // Set the shader source code.
  gl.shaderSource(shader, shaderSource);

  // Compile the shader
  gl.compileShader(shader);

  // Check if it compiled
  var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
  if (!success) {
    // Something went wrong during compilation; get the error
    throw "could not compile shader:" + gl.getShaderInfoLog(shader);
  }

  return shader;
}

对于程序

/**
 * Creates a program from 2 shaders.
 *
 * @param {!WebGLRenderingContext) gl The WebGL context.
 * @param {!WebGLShader} vertexShader A vertex shader.
 * @param {!WebGLShader} fragmentShader A fragment shader.
 * @return {!WebGLProgram} A program.
 */
function createProgram(gl, vertexShader, fragmentShader) {
  // create a program.
  var program = gl.createProgram();

  // attach the shaders.
  gl.attachShader(program, vertexShader);
  gl.attachShader(program, fragmentShader);

  // link the program.
  gl.linkProgram(program);

  // Check if it linked.
  var success = gl.getProgramParameter(program, gl.LINK_STATUS);
  if (!success) {
      // something went wrong with the link
      throw ("program filed to link:" + gl.getProgramInfoLog (program));
  }

  return program;
}

你可以这样称呼它

var vertShader = compileShader(gl, vertShaderSource, gl.VERTEX_SHADER);
var fragShader = compileShader(gl, fragShaderSource, gl.FRAGMENT_SHADER);
var program = createProgram(gl, vertShader, fragShader);

如果您的着色器未编译或链接,则应该将错误打印到 javascript 控制台。它还应该为您提供堆栈跟踪,以便您可以判断代码中的问题所在。

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多