GLSL lowp: синтаксическая ошибка - PullRequest
2 голосов
/ 29 января 2011

Почему следующий шейдер не компилируется на OpenGL (Desktop) - но на OpenGL ES 2.0 (iPhone) он работает хорошо (и я использую тот же код c / c ++ для загрузки, компиляции и компоновки шейдера на обеих платформах) , Мой FragmentShader:

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 Ответ

5 голосов
/ 29 января 2011

До 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" в шейдере определяется ничем, если и только если в среде хоста был установлен DESKTOP.

...