1

WebGlとJavaScriptで簡単なアプリケーションを作成しようとしていますが、インターネットで見つけたチュートリアルをいくつか許可しているときに、基本的なシェーダーを作成しているときに奇妙な問題に遭遇しました。シェーダープログラムを作成する関数は次のようになります。

 this.CreateShaderProgram = function(vertexShader, fragmentShader)
  {
    var tmp = this.gl.createProgram();

    var tempVert = this.gl.createShader(this.gl.VERTEX_SHADER);     
    this.gl.shaderSource(tempVert, vertexShader);
    this.gl.compileShader(tempVert);
    if(!this.gl.getShaderParameter(tempVert, this.gl.COMPILE_STATUS)) {
          this.Log("invalid shader : " + vertexShader);
          return null;
    };

    var tempFrag = this.gl.createShader(this.gl.FRAGMENT_SHADER); 
    this.gl.shaderSource(tempFrag, fragmentShader);
    this.gl.compileShader(tempFrag);    
    if(!this.gl.getShaderParameter(tempFrag, this.gl.COMPILE_STATUS)) {
          this.Log("invalid shader : " + fragmentShader);
          return null;
    };

    this.gl.attachShader(tmp, tempVert);
    this.gl.attachShader(tmp, tempFrag);

    return tmp;
  }

そして、2つのシェーダーは次のようになります。

  attribute vec3 aVertexPosition;
  uniform mat4 uMVMatrix;
  uniform mat4 uPMatrix;
  void main(void) {
         gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
  }
  --------------------------------------------  

  #ifdef GL_ES  precision highp float;
  #endif
  void main(void) { 
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);  };

奇妙なことに、最初のVertex Shaderは正常にコンパイルされますが、フラグメントシェーダーの場合、「this.gl.compileShader(tempFrag);」でクラッシュします。行と私は理由を理解することはできません。

4

2 に答える 2

4

コンパイルされない理由がわからない場合は、次のようにコードを変更してください。

this.gl.compileShader(tempFrag);    
if(!this.gl.getShaderParameter(tempFrag, this.gl.COMPILE_STATUS)) {
      this.Log("invalid shader : " + this.gl.getShaderInfoLog(tempFrag));
      return null;
};

これにより、何が間違っているか(おそらくの使用#ifdef)に関する詳細情報が得られるはずです。

于 2010-11-28T14:08:02.040 に答える
4

コードからのこのスニペット:

#ifdef GL_ES  precision highp float;
#endif

別の行にある必要があります:

#ifdef GL_ES
precision highp float;
#endif

これは、シェーディング言語がCプリプロセッサと同様にプリプロセッサを使用しているためです。で始まる行#は、行全体にまたがるプリプロセッサディレクティブです。ステートメントprecisionはそうではありませんが、これはGLSLの通常のステートメントです。それらを同じ行に配置すると、プリプロセッサはそのディレクティブの一部として精度ステートメントを考慮するため、混乱します。

ZeccのアドバイスgetShaderInfoLogは、この種の問題をデバッグするためにも非常に役立ちます。

于 2010-11-28T14:16:12.943 に答える