Я пытаюсь реализовать преобразование перспективной проекции, используя 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);
}
Я пробовал просматривать квадрат под разными углами и с разных позиций и с отключенным отбраковыванием.
Что не так с моей матрицей перспективной проекции или ее применением?