OpenTK CreatePerspective矩阵运行不正常

时间:2018-12-07 00:47:08

标签: c# opengl visual-studio-2017 opentk

我正在尝试将我的游戏引擎从具有LWJGL 3的Java迁移到具有OpenTK(OpenGL 3+)的C#。到目前为止,我可以绘制带有纹理的三角形。但是,当我尝试将投影矩阵上载到着色器时,它不起作用。这是我尝试过的事情:

-将统一的浮动对象上传到着色器-Works
-仅上传没有透视图的身份矩阵-WORKS
-不要将顶点乘以投影-作品
-手动创建投影-不起作用

这是代码:

//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

顶点着色器:

#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 :(得分:0)

OpenTK以行优先顺序存储其矩阵,而不是像大多数其他矩阵库一样以列优先顺序存储。这意味着您必须更改乘法顺序,因为与标量乘法不同,矩阵乘法是依赖于顺序的。

有两种方法可以解决此问题:

  • 在致电GL.UniformMatrix4时,传递true而不是false。这将对矩阵进行转置,使其处于列主格式。

  • 在顶点着色器中,将矩阵/向量相乘的顺序交换为vec4(pos, 1.0) * projection;

任何一个都应该起作用。