Прецизионный квалификатор выдает ошибку для 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 #versions.

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), а не прецизионный классификатор.

Другие вопросы по тегам