После выбора конкретного цвета (передней или задней стороны) его значение приводится к значению из диапазона [0, 1 ] и перед интерполяцией переводится в формат числа с фиксированной точкой (обычные операции OpenGL). Если требуется более высокая точность или динамический диапазон цвета, приложение должно использовать собственные varying-переменные вместо встроенных gl _Col ог. В этом случае цвет передней/задней стороны выбираться не будет, зато встроенная переменная g 1 _F ront -Faei ng для фрагментного шейдера будет хранить флаг, обозначающий, к какому именно примитиву принадлежит растеризованный фрагмент: переднему или заднему.
4.5.2. Режим размера точки
Вершинные шейдеры могут работать в режиме размерности точки. Размеры точки вычисляются в пикселах и записываются во встроенную переменную gl_Po1 ntSi ze.
Если этот режим включен, размер точки берется из указанной переменной и используется на этапе растеризации, если же выключен ~ из значения, установленного командой gl PointSize. Если gl_PointSize не устанавливается шейдером, но режим включен, размер точки получается неопределенным. Включить или отключить этот режим можно функциями gl ЕпаЫ е и gl Di sabl е с соответствующей константой GL_V ERTEX_PR0GRAM_P01NT_SIZ E_AR В.
Установленный размер точки по умолчанию удобен для приложений, которые не меняют этот размер внутри шейдера. Вообще большинство вершинных шейдеров не заботятся о размере точки и ничего не записывают в gl_PointSize, в таких случаях при растеризации используется значение, ранее установленное функцией gl PointSize.
Если примитив отсечен при включенном режиме размерности точки, значения размера точки отсекаются таким же образом, как и значения цвета. Такие значения используются затем в OpenGL-вычислениях как производные (размер точки, зависящий от расстояния). Так что если для приложения требуется, чтобы размер точки становился меньше с увеличением расстояния до фрагмента, приложение должно само вычислять это значение. Если режим размерности точки выключен и для вычисления размера точки используется ранее установленное gl PointSize значение, изменения размера в зависимости от расстояния не происходит. При этом вторичный, вычисленный размер точки может использоваться для создания эффекта перехода прозрачности при одновременно доступном мультисемплинге. Подробности описаны в спецификации.
Размер точки в зависимости от расстояния должен вычисляться вершинным шейдером без использования стандартного алгоритма OpenGL. Этот стандартный алгоритм вычисляет размер как функцию от расстояния между точкой обзора (0,0, 0,1) и координатами вершины в пространстве координат обзора. И если координаты вершин вычисляются в вершинном шейдере, эта операция не выполняется. С другой стороны, вычисление прозрачности точки может быть сделано правильно, только если известно, примитиву какого типа принадлежит точка. Эта информация вершинному шейдеру недоступна, так как шейдер выполняется еще до сборки примитивов. Например, есть треугольник, у которого настройки передней поверхности GL__FILL, а задней - GL_P0INT. Вершинный шейдер должен вычислять эффект перехода только в случае принадлежности вершины заднему треугольнику. Но это невозможно, так как шейдеру неизвестен тип примитива.