Квалификатор Precision выдает ошибку для OpenGL 3.0 в Mesa 9.2.1

Наблюдается странная проблема с OpenGL 3.0 под Mesa 9.2.1 на Ubuntu 13.10 (64-бит). Определение переменной с явной точностью (например: highp vec2 v;) приводит к ошибке:

syntax error, unexpected VEC2, expecting ',' or ';'

Похоже, что квалификатор точности по каким-то причинам отключен. Примечания к выпуску Mesa не проясняют ситуацию — ни ошибки, ни уведомления относительно темы.

P.S. с квалификатором точности OpenGL ES 3.0 работает корректно.


person Yehor Nemov    schedule 21.11.2013    source источник


Ответы (2)


Убедитесь, что вы указали #version 130.

Без директивы #version OpenGL по умолчанию будет использовать #version 110, где квалификаторы точности, безусловно, недействительны.

P.S. с квалификатором точности OpenGL ES 3.0 работает корректно.

Неудивительно. Квалификаторы точности работают как в OpenGL ES GLSL #versions.

person genpfault    schedule 21.11.2013
comment
#version 130 выдает cannot link program ошибку. С #version 110 фаза связывания пройдена. Все чисто. - person Yehor Nemov; 22.11.2013

highp на самом деле не определено в фрагментных шейдерах по умолчанию, поэтому неудивительно, что это генерирует ошибку синтаксического анализа.

Я чувствую себя заезженной пластинкой, но правильный способ использования highp во фрагментном шейдере — сначала проверить определение препроцессора: GL_FRAGMENT_PRECISION_HIGH. Это определение препроцессора определено на всех этапах, поскольку при выводе чего-либо в вершинном шейдере необходимо знать, будет ли фрагментный шейдер поддерживать highp.

Рассмотрим следующий фрагмент GLSL:

#ifdef GL_FRAGMENT_PRECISION_HIGH
# define maxfragp highp
#else
# define maxfragp medp
#endif

Поскольку вам необходимо обеспечить соответствие точности между вершинным и фрагментным шейдерами для ввода-вывода, вы можете использовать что-то вроде этого (как для фрагментного, так и для вершинного шейдера):

maxfragp varying vec2 tex_st;

Между прочим, вершинные шейдеры всегда поддерживают highp. Это относится только к фрагментным шейдерам.


Учитывая это, вы должны знать, что в настольном GLSL, хотя версия 1.30 определяет квалификаторы точности, они на самом деле ничего не делают. Они нужны просто для того, чтобы упростить портирование шейдеров из GLSL ES.

Язык затенения OpenGL (версия 1.3) — 4.5 Квалификаторы точности - стр. 35

Квалификаторы Precision добавляются для переносимости кода с OpenGL ES, а не для функциональности. У них тот же синтаксис, что и в OpenGL ES, как описано ниже, но они не имеют никакого семантического значения, в том числе не влияют на точность, используемую для хранения или работы с переменными.

Если расширение добавляет ту же семантику и функциональные возможности в спецификации OpenGL ES 2.0 для квалификаторов точности, тогда расширению разрешается повторно использовать приведенные ниже ключевые слова для этой цели.

введите здесь описание изображения

Единственные типы точности, с которыми работает GLSL для настольных ПК, — это числа с плавающей запятой одинарной и двойной точности (GL 4.0+/ARB_gpu_shader_fp64). И эти переменные различаются с помощью разных типов данных (например, dvec2 против vec2), а не квалификатора точности.

person Andon M. Coleman    schedule 21.11.2013
comment
maxfragp varying vec2 tex_st; вызывает ту же ошибку unexpected VEC2. Похоже, что дело в языковой версии затенения. Но glxinfo | grep -i opengl по-прежнему дает мне только 1.30: OpenGL version string: 3.0 Mesa 9.2.1 OpenGL shading language version string: 1.30, где квалификаторы точности не должны вызывать такую ​​ошибку. - person Yehor Nemov; 22.11.2013