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.
Квалификаторы 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