0

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

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;
}

我对变换矩阵并不太熟悉,所以我现在正在学习,如果我想要正交投影,从我读到的上面的矩阵是正确的,这让我很困惑,因为我无法让它工作。

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

图片

编辑: 这是修改后的值:

图片

4

2 回答 2

4

GLSL 中的矩阵是column major。第一个 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)
);

这使用标准的 OpenGLglOrtho变换。原点将在左下角,+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/yzNear/zFar 值在哪里。size.x/y是窗口的宽度/高度。Translate创建一个平移矩阵,并Scale创建一个比例矩阵(它们彼此右乘)。

于 2011-11-09T21:19:49.303 回答
0

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

testmat * vec4(vertex, 0.0, 1.0);

至:

vec4(vertex, 0.0, 1.0) * testmat;
于 2016-02-29T14:09:18.817 回答