2016-07-13 10 views
0

OpenGLを使用して簡単なAndroidゲームを作成しようとしていて、最近までスムーズに進んでいました。私はs7とNexus 5エミュレータでアプリケーションをビルドして実行できましたが、s6で実行しようとすると失敗します。S6シェイダー作成時にAndroid OpenGLコンパイルが失敗する

シェイダーがコンパイルに失敗したようです。私はこの問題を引き起こしているのか分かりません。私は見渡して、数え切れないほどの小さなもので微妙に変化しましたが運がありません。私は明らかな何かを見逃すはずです。私は他の答えを読んだが、他のデバイスですでに動作しているゲームには当てはまらないようだ。以下は、私のシェーダコードと単純なOpenGL関数です。

public Shader(String data, int kind) throws IllegalArgumentException { 
    this.kind = kind; 
    shader = GLES20.glCreateShader(kind); 
    GLES20.glShaderSource(shader, data); 
    GLES20.glCompileShader(shader); 

    int[] compiled = new int[1]; 
    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 
    if (compiled[0] == GLES20.GL_FALSE) { 
     String log = GLES20.glGetShaderInfoLog(shader); 
     dispose(); 
     throw new IllegalArgumentException("Shader compilation error: " + log); 
    } 
} 

次に、シェーディングのためのOpenGL関数を示します。

public static final String VERT_SHADER = 
    "#version 100\n" + 

    "uniform float surfaceRatio;\n" + 
    "attribute vec2 position;\n" + 

    "void main() {\n" + 
    " gl_Position = vec4(position.x * surfaceRatio, position.y, 0.0f, 1.0f);\n" + 
    "}\n"; 

// The fragment shader code. 
public static final String FRAG_SHADER = 
    "#version 100\n" + 

    "uniform vec3 color;\n" + 

    "void main() {\n" + 
    " gl_FragColor = vec4(color, 1.0f);\n" + 
    "}\n"; 

これらのクロスプラットフォームの問題を引き起こす可能性のある明白なことがあるかどうか教えてください。私は必要に応じてより多くのコードや情報を提供することができます。

答えて

0

浮動小数点定数の構文は、GLSL ES 1.00では無効です。 fポストフィックスは、許可された構文の一部ではありません。したがって、シェーダコードに0.0fがある場合は、0.0に置き換える必要があります。1.0fの場合は、になる必要があります。

いくつかのベンダーのGLSLコンパイラ(名前は無名のままです...)は、比較的緩やかな傾向があり、これらの種類のエラーでシェイダーをコンパイルすることはありません。他のベンダーのコンパイラは、準拠していないコードのエラーを報告する方が厳格です。

fポストフィックスは、GLSL ES 3.00以降では有効です。

例えば1.0は、doubleの定数であるC/C++とは異なり、GLSLのタイプfloatの定数であることを理解することが重要です。したがって、後のGLSLのバージョンではfの後置が許されていますが、定数の型は変更されないので、関数は全くありません。

GLSL ESのバージョン(現在の3.2まで)は、二重値をサポートしていません。完全なOpenGL 4.xのみがシェーダで倍精度算術をサポートしています。 OpenGL 4.xでは、タイプdoubleの定数には、lfまたはLFの接尾辞が必要です。接尾辞なしの定数は、依然としてタイプfloatです。

+0

これを先に試してみましたが、エラーはシェーダーの色変数の周りを回転しました。そこにも問題の可能性はありますか?私は後で特定のエラーテキストを提供することができます。私は現在私のターミナルから離れています。ご協力いただきありがとうございます。これは超有益だった。 – Runner5

関連する問題