Матрица перспективной проекции в OpenGL выглядит черной

Я пытаюсь реализовать преобразование перспективной проекции, используя Haskell и OpenGL.

Мои вершины настроены следующим образом:

  let vertices =
        [ -0.3,  0.3,  0, -- Front Top Left 0                         
           0.3,  0.3,  0, -- Front Top Right 1 
           0.3, -0.3,  0, -- Front Bottom Right 2             
          -0.3, -0.3,  0, -- Front Bottom Left  3 
           0.3, 0.3,   0, -- Back Top Left      4            
           0.3,   0,   0, -- Back Top Right     5               
           0.3,   0,   0, -- Back Bottom Right  6              
           0.3, 0.3,   0  -- Back Bottom Left   7  ]

и, не используя преобразование или только преобразование «Вид», все выглядит так, как должно (серый квадрат).

Преобразование вида

 view = [cos ty * cos tz,    cos tz * sin tx * sin ty - cos tx * sin tz,         cos tx * cos tz * sin ty + sin tx * sin tz,    -cx,
         cos ty * sin tz,    cos tx * cos tz + sin tx * sin ty * sin tz,    -1 * cos tz * sin tx + cos tx * sin ty * sin tz,    -cy,
         -1 * sin ty,        cos ty * sin tx,                                    cos tx * cos ty,                               -cz,
         0,                  0,                                                  0,      1]

где (cx, cy, cz) — положение камеры, а (tx, ty, tz) — поворот камеры вокруг оси в радианах Эйлера.


Проблемы возникают, когда я применяю преобразование перспективы

perspective = [scale,     0,                        0,                     0,
                   0, scale,                        0,                     0,
                   0,     0, -1 * (far + near) / diff,                    -1,
                   0,     0,   -2 * near * far / diff,                     0]

где diff = far - near и scale = 1.0 / tan (fov / 2.0) и fov = 0.785.

У меня дальняя и ближняя плоскости 10 и 0,01 соответственно.

После применения с использованием следующего кода GLSL ничего не появляется (т.е. только черный экран).

void main()
{
    Color = color;
    gl_Position = perspective * view * vec4(position, 1.0);
}

Я пробовал просматривать квадрат под разными углами и с разных позиций и с отключенным отбраковыванием.

Что не так с моей матрицей перспективной проекции или ее применением?


person sdasdadas    schedule 22.08.2014    source источник


Ответы (1)


Это было решено путем переноса матрицы вида.

person sdasdadas    schedule 26.08.2014