7

「ガベージ」シェーダーをコンパイルして、ガベージコードをWebGLにフィードしようとしています(フィドルについては、ここを参照してください)。

gl = $('canvas')[0].getContext('experimental-webgl');

source = 'garbage12398sv;aa[]|\[12';

shader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(shader, source);
gl.compileShader(shader);

console.log(gl.getError() === gl.NO_ERROR);

驚いたことに、WebGLにガベージをコンパイルするように要求しているにもかかわらずですgl.getError() === gl.NO_ERRORtrue

getErrorエラーにフラグを立てないのはなぜですか?シェーダーのコンパイルステータスに関するエラー情報を取得するにはどうすればよいですか?

4

1 に答える 1

14

gl.getError は、OpenGL パイプラインのエラーのみを返します。シェーダーがコンパイルに失敗しても、パイプラインでエラーは発生しません。ここでgl.getError について読むことができます。次のようにシェーダーのステータスを照会できます。

var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
console.log('Shader compiled successfully: ' + compiled);
var compilationLog = gl.getShaderInfoLog(shader);
console.log('Shader compiler log: ' + compilationLog);

同様に、シェーダー プログラム リンク エラーは OpenGL パイプラインを無効にせず、gl.getError() で検出できません。オブジェクト (シェーダー、プログラム、レンダー バッファーなど) 固有のエラー クエリ関数を呼び出す必要があります。

于 2012-10-05T23:33:42.440 に答える