#3d #shader #webgl
Вопрос:
Как бы я создал матрицу, которая отображает координаты следующим образом:
Рядом с самолетом
x: [-3,3] -> [-1,1]
y: [-6,2] -> [-1,1]
z: 2 -> -1
Дальний самолет
x: [-4,4] -> [-1,1]
y: [-4,4] -> [-1,1]
z: 0 -> 1
Я могу сделать это в шейдере вершин со специальной функцией, но хотел бы сделать это с помощью матрицы проекции, если это возможно.
vec4 special_projection(vec4 p){
float ty = 0.25 * p.z;
float tx = 0.25 * p.x;
float xz = (tx / 3.0) * (p.z / 2.0);
float x = tx xz;
float y = 0.25 * p.y ty;
float z = -0.5 * p.z;
return vec4(x,y,z,1);
}
Ответ №1:
То, что вы хотите, не представляется возможным с помощью умножения матриц в однородном пространстве 4d, в котором вы работаете.
Чтобы правильно разделить перспективу, вам нужно будет установить w_clip
некоторую линейную функцию z_eye
. Стандартным соглашением GL было бы w_clip = -z_eye
, и я собираюсь использовать его здесь. Чтобы получить y
без искажения перспективы, вам нужно y_clip
умножить на w_clip = - z_eye
.
Вы, конечно, можете записать любую формулу в шейдер, который вам нравится, но имейте в виду, что, искажая пространство так, как вы намереваетесь, перспективная коррекция интерполяции даст результаты, которых вы, возможно, не ожидали.