1

私は 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();。それで、なぜこれが起こるのですか?私はどこを見ますか?これは、シェーダーがコンパイルされないためだと推測していますが、私が知る限り、シェーダーからエラーや警告は出ていません。前述のコード/警告によって難読化されています...さらに、chromeはこれらの警告に言及し、firefoxは言及しません。ただし、どちらもシェーダーを初期化できません

4

1 に答える 1

4

ボイラープレートコードを使用して、シェーダーとリンクプログラムをコンパイルすることをお勧めします

シェーダー用

/**
 * 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コンソールに出力されます。また、コードのどこに問題があるのか​​がわかるように、スタックトレースも提供する必要があります。

于 2013-02-02T10:05:34.180 に答える