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

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: П Вычисленные значения расстояния


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