2011-01-29 6 views
2

OpenGL(デスクトップ)でコンパイルされていない次のシェーダはなぜですか?OpenGL ES 2.0(iPhone)ではうまく動作します(同じC/C++コードを使用してロードします)&両方のプラットフォーム上のシェーダ)。 マイFragmentShader:GLSL lowp:構文エラー

varying lowp vec4 colorVarying; 

void main() 
{ 
    gl_FragColor = colorVarying; 
} 

バーテックスシェーダ:

attribute vec4 position; 
attribute vec4 color; 

varying vec4 colorVarying; 

uniform float translate; 

void main() 
{ 
    gl_Position = position; 
    gl_Position.y += sin(translate)/2.0; 

    colorVarying = color; 
} 

コンパイルログは次のようになります。

Shader compile log: 
ERROR: 0:9: 'lowp' : syntax error syntax error 
ERROR: Parser found no code to compile in source strings. 
Failed to compile fragment shaderProgram validate log: 
Validation Failed: Program is not successfully linked. 
Failed to validate program: 1 

任意のアイデア?

+1

頂点シェーダをフラグメント1に間違って配置しました。 – kvark

+0

ありがとうございます。あなたは実際には – Constantin

答えて

5

GLSLを介して1.1、lowpはGLSLの仕様に言及されていません。 GLSL 1.2(OpenGL 2.1に付属)では、lowpが実装用に予約されています。 OpenGLのlowpで行くGLSL 1.3(で )が許可され始め(ただし、無意味である。

このように、何でも、あなたのデスクトップ上で使用していることだけGLSLの古いバージョンを認識することが表示されます。明らか修正がありますちょうどそれを削除、またはデスクトップのため、のようなマクロを追加するには:あなたはあなたが使用しているものは何でも環境デスクトップに使用しますが、いないどんな環境で定義されていますいくつかの識別子に置き換えDESKTOP

#ifdef DESKTOP 
#define lowp 
#endif 

iPhone。

編集:これをソースコードに入れるそれ自体は自明ではありません。一つの方法は、このようなものです:

char const *shader = 

#ifdef DESKTOP 
    "#define lowp\n" 
#endif 

"varying lowp vec4 colorVarying;\n" 

/* ... */ 
; 

この方法では、「lowpは」デスクトップをホスト環境に設定されている場合に限り、シェーダで何も定義されます。

+1

でした。実際には、言語の新しい機能を使用する場合は、コードに#version 130を指定する必要があります。それ以外の場合(仕様に準拠)、GLコンパイラは110シェーダとしてコンパイルすることになります。 – Bahbar

+1

残念ながら、#version 130を置くと、OpenGL/ESでコンパイルされなくなります。シェーダの上部にある単一の "#version 300 ES"で動作するシェーダを書くことができるようにするには、OpenGL/ES 3.0とOpenGL 4.2を待つ必要があります。 –

+0

どうすればそれを得ることができますかシェーダの識別子私が見ることのできるところから、そこに定義されている唯一のものはGL_ESなので、他のものを得るには、別のシェーダ文字列として 'glShaderSource'に渡す必要があります。 –