Параметры этому шейдеру передаются через 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: П Вычисленные значения расстояния


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