15.1.2. Вершинный шейдер

Вершинный шейдер штриховки приведен в листинге 15.1. Varying-переменная ObjPos нужна как основа для вычислений штриховки во фрагментном шейдере. Чтобы выполнять анимацию штрихов, вершинный шейдер прибавляет uniform-переменную Time к координате z входных координат вершины. Это создаст впечатление, что штрихи «плывут» вдоль оси z. Коэффициент масштабирования учитывает видимый размер объекта на экране. (Чтобы применять его к различным объектам, константное значение нужно заменить uniform-переменной.) Остальная часть вершинного шейдера выполняет простые вычисления диффузного освещения, копирует координату t текстурных координат в varying-переменную V и вычисляет значение встроенной переменной gl_Position.

Листинг 15.1. Вершинный шейдер штриховки

uniform vec3 LightPosition: uniform float Time;
varying vec3 ObjPos; varying float V;

15.1. Штриховка

varying float Lightlntensity;
void main(void) {
ObjPos = (vec3 (gl_Vertex) + vec3 (0.0. 0.0. Time)) * 0.2:
vec3 pos = vec3 (gl_ModelViewMatrix * gl_Vertex); vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal): vec3 lightVec = normal izedightPosition - pos);
Lightlntensity = max(dot(lightVec, tnorm), 0.0);

V = gl_MultiTexCoord0.t; // используйте .s для вертикальных полос

gl_Position = ftransformO:
}

5.1.3. Рисование штриховых полосок Рассматриваемый фрагментный шейдер должен определить цвет фрагмента - белый или черный - таким образом, чтобы получились линии на поверхности объекта. Здесь есть несколько особенностей. Покажем применение нескольких методов на простом объекте - сфере.

Начнем с такого же кода, который представлен в разделе 14.4.1 для вертикальных полосок, а именно:

float sawtooth = fract(V * 16.0):
float triangle = abs(2.0 * sawtooth - 1.0):
float square = step(0.5. triangle):

Здесь V - varying-переменная, передаваемая из вершинного шейдера, она равна текстурной координате s при рисовании вертикальных штрихов и текстурной координате t при рисовании горизонтальных штрихов. Число 16 означает, что будут нарисованы 16 белых и 16 черных полосок. Результат выполнения этого кода показан на рис. 15.1. Относительный размер белых и черных полосок можно изменять с помощью изменения порогового значения функции step.


⇐ Предыдущая| |Следующая ⇒