Vellow 0.6. 0.5. 0.0. 1.0
HalfSpaceO 1.0. 0.0. 0.0. 0.2
HalfSpacel 0.309016994. 0.951056516. 0.0. 0.2
HalfSpace2 -0.809016994. 0.587785252. 0.0. 0.2
НаШрасеЗ -0.809016994. -0.587785252. 0.0. 0.2
HalfSpace4 0.309016994. -0.951056516. 0.0. 0.2
InOrOutlnit -3.0 StripeWidth 0.3 FWidth 0.005
11.2.2. Вершинный шейдер
Фрагментный шейдер в описываемой паре шейдеров - «рабочая лошадка», а вершинный шейдер должен только вычислить координаты центра шара в пространстве координат обзора и координаты пространства отсечения для каждой вершины. Приложение может передавать координаты центра сферы в пространстве координат обзора, но вершинный шейдер и так делает немного работы, и выполнение в нем таких вычислений означает, что приложению теперь не нужно знать о матрице модели-вида. Это значение можно легко вычислить во фрагментном шейдере, но тогда пострадает производительность. Поэтому в нашем случае лучше всего выполнить эти вычисления в вершинном шейдере и передать результат как varying-переменную (листинг 11.4).
Листинг 11.4. Вершинный шейдер игрушечного шара
varying vec4 ECposition: // координаты поверхности в пространстве
// координат обзора varying vec4 ECbal1 Center; // центр шара а пространстве координат обзора uniform vec4 BallCenter; // центр шара в модельных координатах
void main(void)
{
ECposition = glJfodelViewMatrix * gl__Vertex; ECballCenter = glModelViewMatrix * BallCenter: gl_Position = ftransformO :
}
Процедурные текстурные шейдеры
11.2.3. Фрагментный шейдер
Фрагментами шейдер игрушечного мяча немного больше, чем рассмотренный в предыдущих примерах, так что будем разбирать код по строкам и показывать промежуточные результаты. Вот определения локальных переменных, которые будут использоваться в нашем фрагментном шейдере.
vec4 normal: // Вычисленная нормаль
vec4 р; // Точка
vec4 surfCol or: // вычисленный цвет поверхности float intensity: // Вычисленная интенсивность освещения vec4 distance; II Вычисленные значения расстояния float inorout: // Счетчик для вычисления шаблона звезды