当我尝试使用我的正投影时,我没有得到我正在寻找的结果。 我有一个包含以下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;
}
我对转换矩阵并不是太熟悉所以我现在正在学习,而且从我读过的上面的矩阵来看,如果我想要正交投影是正确的,这让我非常困惑,因为我无法得到它工作
这是一个用于说明问题的图像:(请注意,纹理具有透明部分。)
修改 这是修改后的值的显示方式:
答案 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}}