Параметры этому шейдеру передаются через uniform-переменные. Рисунок, показывающий, как будет меняться изображение при изменении параметров, можно увидеть далее в этом разделе, а код шейдера приведен в листинге 11.3.
Листинг 11.3. Значения uniform-переменных для шейдера игрушечного шара
LtghtDiг 0.57735. 0.57735. 0.57735. 0.0
HVectar 0.32506, 0.32506. 0.88808. 0.0
Ball Center 0.0. 0.0. 0.0. 1.0
SpecularColor 0.4, 0.4, 0.4. 60.0
https://smotri-sumerki.online.
Red 0.5. 0.0. 0.0. 1.0
Blue 0.0, O.3., 0.6, 1.0
Yellow 0.5. 0.5. 0.0. 1.0
HalfSpaceO 1.0. 0.0. 0.0, 0.2
HalfSpacel 0.309015994, 0.951056516. 0.0. 0.2
HalfSpace2 -0.809016994, 0.587785252. 0.0. Q.2
HalfSpace3 -0.809016994. -0.587785252. 0.0, 0.2
Ha1fSpace4 0.309016994. -0.951056516. 0.0, 0.2
InOrOutlnit -3.0
StripeWi dth 0.3
FWidth 0.005
11.2.2. Вершинный шейдер
Фрагментиый шейдер в описываемой паре шейдеров - «рабочая лошадка?-, а вершинный шейдер должен только вычислить координаты центра шара в пространстве координат обзора и координаты пространства отсечения для каждой вершины. Приложение может передавать координаты центра сферы в пространстве координат обзора, но вершинный шейдер и так делает немного работы, и выполнение в нем таких вычислений означает, что приложению теперь не нужно знать о матрице модели-вида. Это значение можно легко вычислить во фрагментном шейдере, но тогда пострадает производительность. Поэтому в нашем случае лучше всего выполнить эти вычисления в вершинном шейдере и передать результат как varying-переменную (листинг 11.4).
Листинг 11.4. Вершинный шейдер игрушечного шара
varying vec4 ECpositicn: // координаты поверхности в пространстве
// координат обзора varying vec4 ECbalICenter; // центр шара в пространстве координат обзора uniform vec4 Bel 1 Center: // центр шара в модельных координатах
void main(void)
{
ECposition = gl_ModelViewMatrix * gl__Vertex;
ECballCenter = gl_ModelViewMatnx * Ball Center; gl_Position = ftransformC);
}
11.2.3. Фрагментный шейдер
Фрагментный шейдер игрушечного мяча немного больше, чем рассмотренный в предыдущих примерах, так что будем разбирать код по строкам и показывать промежуточные результаты. Вот определения локальных переменных, которые будут использоваться в нашем фрагментном шейдере.
vec4 normal: // Вычисленная нормаль
vec4 р: // Точка
vec4 surfColor: // Вычисленный цвет поверхности
float intensity: // Вычисленная интенсивность освещения
vec4 distance: П Вычисленные значения расстояния
