Я пытаюсь создать матрицу ModelViewProjection в OpenTK.

Я пытаюсь создать матрицу проекции модели для своего шейдера следующим образом:

Я получаю матрицу для перевода камеры:

public Matrix4 GetMatrix()
{
    return Matrix4.LookAt(Position, LookingAt, Vector3.UnitY);
}

Postition — текущая позиция камеры, LookingAt — цель камеры.

Теперь я собираю финальную матрицу для шейдера и передаю ее:

Matrix4 cameraMatrix = camera.GetMatrix();
Matrix4 mvprojectionMatrix = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, 16f / 9f, 1f, 30f) * cameraMatrix;

GL.UniformMatrix4(mvprojectionMatrixAttribute, false, ref mvprojectionMatrix);

Это вершинный шейдер (сквозной)

[Вершина шейдера]

#version 150 core
in vec3 pos;
in vec3 color;
uniform float time;
uniform vec3 offset;
uniform mat4 cameraView;
uniform mat4 projection;


out float vTime;
out vec3 vColor;
out mat4 vProjection;
void main() {
    gl_Position = vec4(pos, 1.0);
    vColor = color;
    vTime = time;
    vProjection = projection;
}

Я передаю это шейдеру геометрии, где я использую их для позиционирования своих вершин:

void makeVertex(vec3 shift, mat4 rotation)
{
    gl_Position = (gl_in[0].gl_Position + vec4(shift, 0.0) * rotation) * vProjection[0];
    EmitVertex();   
}

матрица поворота — это просто локальное вращение вершины. vProjection[0] исходит из вершинного шейдера...

Каким-то образом, если камера перемещается, вещи быстро покидают область видимости, но сам вид не перемещается. Поэтому я предполагаю, что матрица просмотра модели неверна (не переводится из камеры в мировое пространство). Но я не уверен, как создать правильную матрицу.

Какие-нибудь советы ? Спасибо.


person pixartist    schedule 01.07.2014    source источник
comment
Кажется, это не сочетается. В коде C# вы строите матрицу модель-представление-проекция и используете ее для установки универсального значения. Но тогда ваш вершинный шейдер объявляет отдельные матрицы cameraView и projection. Где cameraView никогда не используется. Вы уверены, что это последовательный набор кода?   -  person Reto Koradi    schedule 02.07.2014
comment
Да, я использовал оба раньше, теперь я просто перемножаю их в C#. Так что да, один из них не используется.   -  person pixartist    schedule 02.07.2014


Ответы (1)


Я перемножил матрицы в неправильном порядке.

person pixartist    schedule 02.07.2014