Прецизионный квалификатор выдает ошибку для 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 не проясняют ситуацию - ни ошибки, ни уведомления не относятся к теме.
PS с прецизионным классификатором OpenGL ES 3.0 работает правильно.
2 ответа
Убедитесь, что вы указали #version 130
,
Без #version
Директива OpenGL по умолчанию будет #version 110
где прецизионные квалификаторы наверняка недействительны.
PS с прецизионным классификатором OpenGL ES 3.0 работает правильно.
Неудивительно. Прецизионные классификаторы работают в обоих OpenGL ES GLSL #version
s.
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
Прецизионные квалификаторы добавлены для переносимости кода с OpenGL ES, а не для функциональности. У них тот же синтаксис, что и в OpenGL ES, как описано ниже, но они не имеют семантического значения, что не влияет на точность, используемую для хранения или работы с переменными.
Если расширение добавляет ту же семантику и функциональность в спецификацию OpenGL ES 2.0 для прецизионных квалификаторов, тогда расширению разрешается повторно использовать приведенные ниже ключевые слова для этой цели.
Единственные типы прецизионных настольных систем, с которыми имеет дело GLSL, - это одинарная и двойная точность (GL 4.0+ / ARB_gpu_shader_fp64
) плавающая запятая. И эти переменные различаются с использованием разных типов данных (например, dvec2
против vec2
), а не прецизионный классификатор.