Как изменить размер орто-матрицы в шейдере - PullRequest
1 голос
/ 20 июня 2020

Я пробовал масштабировать матрицу ортогональной проекции, но кажется, что она не масштабирует ее размеры. Я использую ортогональную проекцию для направленного освещения. Но если основная камера находится над землей, я хочу увеличить диапазон моей орто-матрицы.

Например, если камера равна нулю, матрица орхо glm::ortho(-10.0f , 10.0f , -10.0f , 10.0f , 0.01f, 4000.0f)

, но если камера переходит на 400 по оси y Направление я хочу, чтобы эта матрица была похожа на glm::ortho(-410.0f , 410.0f , -410.0f , 410.0f , 0.01f, 4000.0f)

, но я хочу сделать это в шейдере с умножением или сложением матриц

1 Ответ

2 голосов
/ 20 июня 2020

Матрица Orthographi c Projection может быть вычислена с помощью:

r = right, l = left, b = bottom, t = top, n = near, f = far

X:    2/(r-l)         0               0               0
y:    0               2/(t-b)         0               0
z:    0               0               -2/(f-n)        0
t:    -(r+l)/(r-l)    -(t+b)/(t-b)    -(f+n)/(f-n)    1

В glsl, например:

float l = -410.0f;
float r =  410.0f;
float b = -410.0f;
float t =  410.0f;
float n =  0.01f;
float f =  4000.0f;

mat4 projection = mat4(
    vec4(2.0/(r-l),     0.0,          0.0,         0.0),
    vec4(0.0,           2.0/(t-b),    0.0,         0.0),
    vec4(0.0,           0.0,         -2.0/(f-n),   0.0),
    vec4(-(r+l)/(r-l), -(t+b)/(t-b), -(f+n)/(f-n), 1.0)
);

Кроме того, вы можете масштабировать ортогональную c матрицу проекции:

c ++

glm::mat4 ortho = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, 0.01f, 4000.0f);

float scale = 10.0f / 410.0f;
glm::mat4 scale_mat = glm::scale(glm::mat4(1.0f), glm::vec3(scale, scale, 1.0f));
glm::mat4 ortho_new = ortho * scale_mat;

glsl

float scale = 10.0 / 410.0;
mat4 scale_mat = mat4(
    vec4(scale, 0.0,   0.0, 0.0),
    vec4(0.0,   scale, 0.0, 0.0),
    vec4(0.0,   0.0,   1.0, 0.0),
    vec4(0.0,   0.0,   0.0, 1.0)
);

mat4 ortho_new = ortho * scale_mat;
...