Войти
ПрограммированиеТерминыГрафика

Billboard (Биллборд/Спрайт)

Биллборд - прямоугольник, лицевая сторона которого всегда ориентирована на камеру, т.е. перпендикулярна вектору взгляда. Обычно используются для вывода систем частиц и импостеров.

Пример реализации:
Итак, имеем центр биллборда(точка в которой мы хотим его нарисовать), и камеру, которая представлена 3 единичными векторами: up, right, direction. Векторы эти можно получить из рассчитанной матрицы вида в Direct3D и из модельно-видовой матрицы в OpenGL ИЛИ вычислить вручную используя вектор direction( billboardPos - cameraPos ) и два векторных произведения. Для ориентации биллборда нужны всего два вектора - up и right, которые будут использованы для вычисления 4 точек биллборда, делать это можно на CPU, а можно и на GPU, используя возможности программируемого конвейера.

Fixed pipeline:

// ** p - положение биллборда
// ** s - полуразмер биллборда
// ** r - right вектор (единичный)
// ** u - up вектор (единичный)

// ** Вычисляем 4 точки биллборда
cVector3 v0 = position - r*s - u*s; // ** Сдвигаемся влево-вниз от центра биллборда
cVector3 v1 = position - r*s + u*s; // ** Влево-вверх...
cVector3 v2 = position + r*s + u*s; // **  Вправо-вверх
cVector3 v3 = position + r*s - u*s; // ** Вправо-вниз...

// ** И рисуем
glBegin( GL_QUADS );
    glTexCoord2f( 0, 0 ); glVertex3fv(  &v0.x );
    glTexCoord2f( 1, 0 ); glVertex3fv(  &v1.x );
    glTexCoord2f( 1, 1 ); glVertex3fv( &v2.x );
    glTexCoord2f( 0, 1 ); glVertex3fv( &v3.x );
glEnd();

Programmable pipeline:

// ** Пример простейшего шейдера ориентации биллборда
// ** На вход вершинному шейдеру подаются вершины прямоугольника
// ** с координатами( -s, -s, 0 ), ( -s, s, 0 ), ( s, s, 0 ), ( s, -s, 0 ) (прямоугольник в плоскости XY), где s - размер биллборда

<vertex>
// ** Положение биллборда, если биллбордов надо рисовать много(система частиц),
// ** то передавать его через uniform не выйдет :), но это лишь пример
uniform vec3 u_Position;

void main( void ) {
    // ** Получаем up & right векторы
    vec3 X = vec3( gl_ModelViewMatrix[0][0], gl_ModelViewMatrix[1][0], gl_ModelViewMatrix[2][0] );
    vec3 Y = vec3( gl_ModelViewMatrix[0][1], gl_ModelViewMatrix[1][1], gl_ModelViewMatrix[2][1] );

    // ** Вычисляем положение вершины
    vec3 vertex = gl_Vertex.x * X + gl_Vertex.y * Y + u_Position;
    gl_Position = gl_ModelViewProjectionMatrix * vec4( vertex, 1.0 );
}

Что такое Billboard (Биллборд/Спрайт)?

#OpenGL

11 февраля 2008 (Обновление: 10 июня 2011)

Комментарии [11]