在屏幕左下方有原点的正投影

时间:2012-11-16 05:17:50

标签: math opengl matrix orthographic projection-matrix

我正在使用python OpenGL绑定,并尝试仅使用现代opengl调用。我有一个带有verticies的VBO,我正在尝试使用传递给顶点着色器的正交投影矩阵进行渲染。

目前我正在使用以下值计算我的投影矩阵:

from numpy import array

w = float(width)
h = float(height)
n = 0.5
f = 3.0

matrix = array([
                   [2/w,        0,        0,        0],
                   [  0,      2/h,        0,        0],
                   [  0,        0,  1/(f-n), -n/(f-n)],
                   [  0,        0,        0,        1],
               ], 'f')


#later
projectionUniform = glGetUniformLocation(shader, 'projectionMatrix')
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

我从这里得到的代码:

Formula for a orthogonal projection matrix?

这似乎工作正常,但我希望我的Origin位于屏幕的左下角。这是一个我可以应用于我的矩阵的函数,所以一切都“正常”,或者我必须手动翻译每个对象2/2小时?

旁注:坐标是否与像素位置匹配,这是否正常工作?

因为我使用的是现代OpenGL技术,所以我认为我不应该使用gluOrtho2d或GL_PROJECTION调用。

3 个答案:

答案 0 :(得分:1)

您可以使用更通用的投影矩阵,该矩阵另外使用左,右位置。

有关定义,请参阅Wikipedia

答案 1 :(得分:1)

glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

您的矩阵以行主要顺序存储。因此,您应该传递GL_TRUE,或者您应该将矩阵更改为column-major。

答案 2 :(得分:1)

我还没有完全熟悉投影,因为我最近才开始使用OpenGL编程,但是你当前的矩阵并没有翻译任何点。对角线将应用缩放,但最右侧的列将应用平移。 Dirk提供的链接为您提供了一个投影矩阵,可以使您的原点(0,0是您想要的,是吗?)在屏幕的左下角。

我曾经用过的矩阵(每行实际上是OpenGL的一列):

OrthoMat = mat4(
        vec4(2.0/(screenDim.s - left),  0.0,    0.0,    0.0),
        vec4(0.0,   2.0/(screenDim.t - bottom),     0.0,    0.0),
        vec4(0.0,   0.0,    -1 * (2.0/(zFar - zNear)),  0.0),
        vec4(-1.0 * (screenDim.s + left)/(screenDim.s - left), -1.0 * (screenDim.t + bottom)/(screenDim.t - bottom), -1.0 * (zFar + zNear)/(zFar - zNear), 1.0)
 );

screenDim数学实际上是宽度或高度,因为左边和底部都设置为0. zFar和zNear分别为1和-1(因为它是2D,它们并不是非常重要)。

此矩阵以像素为单位取值,顶点位置也需要以像素为单位。当你调整屏幕大小时,点(0,32)将始终处于相同的位置。

希望这有帮助。

编辑#1:要清楚,我说的左/下/ zfar / znear值是选择制作它们的值。您可以根据自己的需要更改这些内容。