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

#c# #opengl #matrix #projection #opentk

#c# #opengl #матрица #проекция #opentk

Вопрос:

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

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

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

Положение — это текущее положение камеры, 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] происходит из вершинного шейдера…

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

Какие-либо советы? Спасибо.

Комментарии:

1. Похоже, это не подходит друг другу. В вашем коде C # вы создаете матрицу model-view-projection и используете ее для установки единообразного значения. Но тогда ваш вершинный шейдер объявляет отдельные cameraView и projection матрицы. Где cameraView никогда не используется. Вы уверены, что это согласованный набор кода?

2. Да, я использовал оба раньше, теперь я просто умножаю их на C #. Так что да, один из них не используется.

Ответ №1:

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