2015年1月24日土曜日

Open GL のエラー

とりあえずどこを見ればいいのか全くわからないが、初期化処理でエラーが出てしまいどこがだめなのかすら見当がつかなかった。

 glError 1280

出てきたコードはこのエラー番号。
内容は「GL_INVALID_ENUM 無効な列挙 GLenum型の引数が範囲を超えている」らしいです。



場所はGLES20.glAttachShaderでVertexShaderを指定しているところでエラーが出ている。
最初はShaderのコードに問題点があるのかと思い、目を皿のようにして一字一句確認してみた。
問題点が見当たらないので、ためしにわざと定義に不要な文字を追加してエラーになるか確認してみたところ、実行するとちゃんとCompile failed.としてエラーが出てくる。

Shaderは扱ったことが無いので全くわからないので、スッキリしないまま途方にくれることに。

結論から言えば、初期化部分で
        GLES20.glEnable(GLES20.GL_CULL_FACE);
        GLES20.glFrontFace(GLES20.GL_CCW);
        GLES20.glEnable(GLES20.GL_DEPTH_TEST);
とするところを微妙に
        GLES20.glEnable(GLES20.GL_CULL_FACE);
        GLES20.glFrontFace(GLES20.GL_DEPTH_TEST);
という風に飛ばしていました。
GLES20.glFrontFaceの時点でエラーが内部的には出ているのかもしれませんけど、そこは拾ってないもので(笑)
Pascalベースなら定数でも型を持っているためにこの手のエラーは発生しづらいが、一般的な定数はただの定数なのでこの手のエラーは非常に厄介。
解ってしまえばたいしたことは無いのですがね。

今の知識ではどうしてこの設定が変っただけで 1280 エラーが出るのかまではわかりません。
実行してみるととりあえず画面描画がようやく行われるようになりました。

若干見た目が違っているので何かが違うということですが、デバッグログには永遠と 1281 エラーが出ていてこの内容は、
「GL_INVALID_VALUE 無効な値 引数が範囲を超えている」
だそうです。
今度は描画まで入っているのでトップダウン的に見ていきます。
早速最初でありました。
       GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
とすべきところを
       GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BIT);
となっていました。

入力補助が強力すぎて自動的に補完されてしまうのでトントンと調子に乗っているとやってしまいそうなミスですね…。

しかしながら、これはあくまでもクリア処理なので見た目は変りません。
形が明らかに違うので今度は描画要素側の処理を見ていきます。

単純に頂点が一つだけz座標が抜けておりました。

ようやく完成(笑)

0 件のコメント:

コメントを投稿