【问题标题】:OpenTK CreatePerspective Matrix Not Behaving ProperlyOpenTK CreatePerspective 矩阵行为不正确
【发布时间】:2019-01-21 09:47:54
【问题描述】:

我正在尝试将我的游戏引擎从使用 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。

【问题讨论】:

  • 你的顶点坐标是什么?你使用 View Matrix 吗?
  • 不,它只是一个没有视图的投影矩阵,顶点坐标有一个-2作为z坐标。

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


【解决方案1】:

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

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

  • 在您对GL.UniformMatrix4 的调用中,传递true 而不是false。这将转置您的矩阵,使其采用列优先格式。

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

任何一个都应该工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2019-11-23
    相关资源
    最近更新 更多