4.5.3. Отсечение

Отсечение, заданное пользователем, может выполняться совместно с вершинным шейдером. Дополнительные плоскости отсечения задаются командой gl Cl i рР1 ane. Потом эти плоскости будут преобразованы инвертированием текущей матрицы модели-вида. После выполнения вершинного шейдера полученные координаты вершины оцениваются относительно этих плоскостей отсечения, и шейдер должен представить координаты вершины в том же пространстве координат, в кото- • ром они определены для плоскости отсечения (обычно это пространство обзора). Такие координаты вершины задаются в переменной gl_Cl i pVertex. Если эта переменная не определена или не заполнена шейдером, а пользовательское отсечение включено, результаты могут стать непредсказуемыми.

Если вершинный шейдер имитирует стандартные операции OpenGL, он должен и вычислять координаты вершины в пространстве обзора, и сохранять их в gKlipVertex, например:

g1_ClipVertex = glMpdelViewMatrix * g1_Vertex; Если все же необходимо делать отсечение в предметном пространстве координат, плоскости отсечения должны быть преобразованы инверсией матрицы модели-вида. Чтобы получилось правильное отсечение, матрица модели-вида должна быть преобразована в единичную матрицу.

После пользовательского отсечения вершины, как обычно, отсекаются углом обзора. При этом значения из gl_Position (однородные координаты точки в пространстве отсечения) сравниваются с углом обзора.

4.5.4. Координаты растра

Вершинный шейдер работает с координатами, заданными командой gIRasterPos, точно так же, как с координатами, заданными gl Vertex. Вершинный шейдер обязан представлять данные для вычисления координат текущего растра.

Данные, представляющие текущие координаты растра, состоят из следующих элементов:

I. Оконных координат, вычисленных из g1_Position. Эти координаты воспринимаются как координаты точки, которые прошли отсечение и проецирование на оконное пространство координат.

■ 1 Бита, обозначающего, была ли точка отбракована.

3. Расстояния до растра, которое устанавливается в varying-переменную gl_Fog-FragCoord вершинного шейдера,

4. Цвета растра, устанавливаемого либо из gl_FrontColor, либо из gl_BackColor, в зависимости от того, передняя или задняя грань была выбрана,

5. Вторичного цвета растра, устанавливаемого из varying-переменных: либо из gl_FrontSeconda ryCol or, либо из gl _BackSeco.nda ryCol or, в зависимости от того, передняя или задняя грань была выбрана.

6. Одной или больше растровых текстурных координат. Они берутся из varying-переменной вершинного шейдера - массива gl_TexCoard[],

7. Индекса цвета растра. Так как в режиме индексированного цвета результат выполнения вершинного шейдера не определен, значение индекса цвета растра всегда устанавливается в 1.

Если переменные, нужные для получения данных, описанных в первых шести пунктах, отсутствуют, значения соответствующих элементов данных останутся не определенными,

4.5.5. Инвариантность координат

Для многопроходного рендеринга, подразумевающего, что часть операций выполняется вершинным шейдером, а часть - внутри OpenGL, важна инвариантность координат. Это означает, что вычисленные вершинным шейдером и стандартными операциями координаты вершины в пространстве отсечения должны совпадать при одинаковых координатах в предметном пространстве и при одних и тех же матрицах проекции и модели-вида. Такая инвариантность может быть достигнута использованием встроенной функции ftransforrh в вершинном шейдере: gl_Positi'On = ftransformO:


⇐ вернуться назад | | далее ⇒