2011-01-29 36 views
2

爲什麼下面的着色器,不是在OpenGL(桌面)上編譯 - 而是在OpenGL ES 2.0(iPhone)上運行良好(我使用相同的c/C++代碼來加載,編譯&鏈接在兩個plattforms上着色)。 我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 2011-02-09 21:36:05

+0

謝謝。實際上,如果使用語言的更新特性,則實際上是正確的 – Constantin 2011-02-09 22:11:59

回答

5

直到GLSL 1.1,lowp未在GLSL規範中提及。 在GLSL 1.2中(與OpenGL 2.1一起使用)lowp保留用於實現。 在GLSL 1.3中(開始允許使用OpenGL lowp(但是沒有意義)

因此,無論您在桌面上使用什麼,只會識別舊版本的GLSL。直接刪除,或者在桌面上,添加宏,如:

#ifdef DESKTOP 
#define lowp 
#endif 

DESKTOP一些標識取代了在您使用的是桌面上的任何環境中定義的,而不是你使用無論什麼環境iPhone。

編輯:進入源代碼本身可以是不平凡的。一種方法是這樣的:

char const *shader = 

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

"varying lowp vec4 colorVarying;\n" 

/* ... */ 
; 

這樣一來,「lowp」被定義爲沒有在當且僅當桌面在主機環境中設置着色器。