2011-10-02 5 views
3

私はOpenGL ES 2.0エンジンでオンラインチュートリアル(lighthouse3d.com)からいくつかのシェーダを実装しようとしています。GLSL ESのローカル変数がクラッシュしますか?

何らかの理由で、main()のスコープで宣言されたANY変数がシェーダ全体を失敗させるという問題があります。例えば、これは失敗します。

void main(){ 
    vec4 color;  
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0); 
} 

が、これは完璧に動作します:

void main(){ 
    //vec4 color;  
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0); 
} 

同じことが私の頂点シェーダで発生します(EDIT:NVMは、断片のみシェーダで発生するようです)。のみあなたが期待するようにこの作品、例えばなどの属性、可変長、制服を、使用することです非定数値のいずれかのタイプを使用する方法:

uniform sampler2D texture; 
varying lowp vec4 fragcol; 
varying lowp vec2 texco; 

void main(){ 
    gl_FragColor = fragcol * texture2D(texture, texco); 
} 

また、私は、GLSL ES(またはこのバージョンが呼ばれているもの)に関するドキュメントやリソースを見つけるのに苦労しています。これは私が変数宣言に関連見つけることができるすべてであるhttp://old.siggraph.org/publications/2006cn/course16/KhronosSpecs/ESLanguageSpec1.10.11.pdf

[snip]There are no default types. All variable and function declarations must have a declared type, and optionally qualifiers. A variable is declared by specifying its type followed by one or more names separated by commas.[snip]

そして、それは私がやったまさにです:

宣言された型:私は見つけることができましたすべてがこれですvec4

の後に1つ以上の名前が続く:;

vec4 color 

は私が無知だ

EDIT: GLES20.glGetErrorは()、それはフルを指定するために精密な修飾を必要としてエラー1282

+1

使用しているコンパイラ/インプリメンテーションは? –

+0

おっと!私は何かを忘れていることを知っていた。アンドロイド開発キットを使用してAndroidで開発中です。投稿を更新する必要があります – AlexRamallo

答えて

9

GLSL ESは、伝統的なGLSLと異なっていますタイプ。あなたは、例えばを試してみました。:

void main(){ 
    lowp vec4 color;  
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0); 
} 

をあなたはまた、ソースファイルの先頭には、このような何かを投げることができます。

precision highp float; 

をあなたが後でそれを省略することができるように、デフォルトの精度を設定します。

GLSLをコンパイルする際のエラーの詳細については、の援助でglGetProgramInfoLogを使用してください。ほとんどのGL実装は意味のあるエラーと行番号を返します。私は悲しいことにJavaで逆行していますが、C言語では次のようになります。

glCompileShader(shader); 

    // check whether compilation was successful; if not 
    // then dump the log to the console 
    GLint status; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 
    if(!status) 
    { 
     GLint logLength; 
     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength); 
     if (logLength > 0) 
     { 
      GLchar *log = (GLchar *)malloc(logLength); 
      glGetShaderInfoLog(shader, logLength, &logLength, log); 
      printf("Shader compile log:\n%s", log); 
      free(log); 
     } 
    } 
+0

"[Shader Error] Link Error:フラグメントシェイダーが正しくコンパイルされませんでした。 > _>あまり役に立たない** EDIT:**ログは失敗だったので、精密修飾子を追加しようとしました!ビット情報が見つけやすいはずだったと思います。助けてくれてありがとう – AlexRamallo

+0

@AlexRamallo OpenGL ESのリソースから学び、デスクトップGLの例を1行ずつコピーしようとすると、これは必ずしも正しく動作しないので、簡単に見つけ出すことができます。 –

関連する問題