OpenTK CreatePerspective Matrix не работает должным образом - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь перевести свой игровой движок с Java с LWJGL 3 на C # с OpenTK (OpenGL 3+).Пока что я могу нарисовать треугольник с текстурой.Однако, когда я пытаюсь загрузить матрицу проекции в шейдер, она не работает.Вот что я пробовал:

-Загрузить равномерное число с плавающей точкой в ​​шейдер - Работает
-Загрузить только единичную матрицу без перспективы - РАБОТАЕТ
-Не умножать вершину на проекцию - Работает
-Создать проекцию вручную - не работает

Вот код:

//At the top of class
Matrix4 projection;

//In render method
projection = Matrix4.Identity;
projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4,
            1280 / 720, 1f, 100f);

int loc = GL.GetUniformLocation(progId, "projection");
GL.UniformMatrix4(loc, false, ref projection);
//Other render stuff

Vertex Shader:

#version 330 core

layout (location = 0) in vec3 pos;
layout (location = 1) in vec2 uv;

out vec2 frag_uv;

uniform mat4 projection;

void main()
{
    gl_Position = projection * vec4(pos, 1.0);
    frag_uv = uv;
}

Как я уже сказал, я думаю, что униформа загружена правильнопотому что когда я удаляю метод CreatePerspectiveFOV, треугольник появляется снова.Я использую Visual Studio 2017.

1 Ответ

0 голосов
/ 21 января 2019

OpenTK хранит свои матрицы в главном порядке строк, а не в главном столбце, как большинство других библиотек матриц.Это означает, что вам нужно изменить порядок умножения, поскольку умножение матриц зависит от порядка, в отличие от скалярного умножения.

Существует два способа исправить это:

  • В вашем звонке на GL.UniformMatrix4 введите true вместо false.Это транспонирует ваши матрицы так, чтобы они находились в основном формате столбцов.

  • В вашем вершинном шейдере поменяйте местами порядок умножения матрицы / вектора, чтобы он равнялся vec4(pos, 1.0) * projection;.

Либо надо работать.

...