GLSL正交投影矩阵不像它应该的那样工作

时间:2011-11-09 19:32:20

标签: opengl matrix glsl vertex-shader

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

0, 0,
0.0, 0.0,
512, 0,
1.0, 0.0,
512, 512,
1.0, 1.0,
0, 512,
0.0, 1.0

目前,我使用glDrawArrays(GL_TRIANGLE_FAN, 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;
}

我对转换矩阵并不是太熟悉所以我现在正在学习,而且从我读过的上面的矩阵来看,如果我想要正交投影是正确的,这让我非常困惑,因为我无法得到它工作

这是一个用于说明问题的图像:(请注意,纹理具有透明部分。)

image

修改 这是修改后的值的显示方式:

image

2 个答案:

答案 0 :(得分:4)

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 glOrtho转换。原点位于左下角,+ 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);

其中depthRange.x/y是zNear / zFar值。 size.x/y是窗口的宽度/高度。 Translate创建了一个翻译矩阵,Scale创建了一个比例矩阵(它们相互正确相乘)。

答案 1 :(得分:0)

问题是 - 乘以矩阵。改变:

vec4(vertex, 0.0, 1.0) * testmat;

为:

{{1}}