#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:
Я умножил матрицы в неправильном порядке.