Opengl GLSL正交投影矩阵不能像它那样工作';应该是的

Opengl GLSL正交投影矩阵不能像它那样工作';应该是的,opengl,matrix,glsl,vertex-shader,Opengl,Matrix,Glsl,Vertex Shader,当我尝试使用正交投影时,我没有得到我想要的结果。 我有一个VBO,其中包含以下2D顶点和texcoords(每隔一行): 目前,我使用gldrawArray(GL_三角形_扇,0,4)绘制它们 VBO似乎没有任何问题(我已经在gDEBugger中检查过),相反,问题似乎在于顶点着色器 这是有问题的着色器: #version 420 uniform mat4 projection; uniform mat4 modelview; layout(location = 0) in vec2 ver

当我尝试使用正交投影时,我没有得到我想要的结果。 我有一个VBO,其中包含以下2D顶点和texcoords(每隔一行):

目前,我使用
gldrawArray(GL_三角形_扇,0,4)绘制它们
VBO似乎没有任何问题(我已经在gDEBugger中检查过),相反,问题似乎在于顶点着色器

这是有问题的着色器:

#version 420

uniform mat4 projection;
uniform mat4 modelview;

layout(location = 0) in vec2 vertex;
layout(location = 1) in vec2 texcoord;

out vec2 f_texcoord;

void main() {
    const float right = 800.0;
    const float bottom = 600.0;
    const float left = 0.0;
    const float top = 0.0;
    const float far = 1.0;
    const float near = -1.0;

    mat4 testmat = mat4(
        vec4(2.0 / (right - left), 0, 0, -(right + left) / (right - left)),
                    vec4(0, 2.0 / (top - bottom), 0, -(top + bottom) / (top - bottom)),
                    vec4(0, 0, -2.0 / (far - near), -(far + near) / (far - near)),
                    vec4(0, 0, 0, 1)
    );
    gl_Position = testmat * vec4(vertex, 0.0, 1.0);
    f_texcoord = texcoord;
}
我对变换矩阵不太熟悉,所以我现在正在学习,从我读到的内容来看,如果我想要正交投影,上面的矩阵是正确的,这让我非常困惑,因为我无法让它工作

下面是一幅图像来说明问题:(请注意,纹理具有透明部分。)

编辑: 以下是修改后的值的外观:

GLSL中的矩阵是主列。第一个vec4应该是第一列,而不是第一行。最后一个坐标应为零

mat4 testmat = mat4(
    vec4(2.0 / (right - left), 0, 0, 0,
    vec4(0, 2.0 / (top - bottom), 0, 0),
    vec4(0, 0, -2.0 / (far - near), 0),
    vec4(-(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near), 1)
);
这使用标准的OpenGL转换。原点将位于左下角,+X向右移动,+Y向上移动。这是OpenGL的标准

如果你想要一个左上角的原点,+Y向下,你必须相应地调整矩阵

我这样做的代码如下:

Translate(-1.0f, 1.0f, (depthRange.x + depthRange.y) / 2.0f);
Scale(2.0f / size.x, -2.0f / size.y, 1.0f);
其中
deptrange.x/y
是zNear/zFar值<代码>大小。x/y
是窗口的宽度/高度<代码>平移创建平移矩阵,
缩放
创建缩放矩阵(它们彼此右乘)。

GLSL中的矩阵是主列。第一个vec4应该是第一列,而不是第一行。最后一个坐标应为零

mat4 testmat = mat4(
    vec4(2.0 / (right - left), 0, 0, 0,
    vec4(0, 2.0 / (top - bottom), 0, 0),
    vec4(0, 0, -2.0 / (far - near), 0),
    vec4(-(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near), 1)
);
这使用标准的OpenGL转换。原点将位于左下角,+X向右移动,+Y向上移动。这是OpenGL的标准

如果你想要一个左上角的原点,+Y向下,你必须相应地调整矩阵

我这样做的代码如下:

Translate(-1.0f, 1.0f, (depthRange.x + depthRange.y) / 2.0f);
Scale(2.0f / size.x, -2.0f / size.y, 1.0f);

其中
deptrange.x/y
是zNear/zFar值<代码>大小。x/y是窗口的宽度/高度<代码>翻译创建翻译矩阵,而
缩放
创建缩放矩阵(它们彼此相乘)。

问题是-矩阵相乘。更改:

testmat * vec4(vertex, 0.0, 1.0);
致:


问题是矩阵相乘。更改:

testmat * vec4(vertex, 0.0, 1.0);
致:


非常感谢你!就这样非常感谢你!就这样