原点位于屏幕左下角的正交投影



我正在使用python OpenGL绑定,并试图只使用现代的OpenGL调用。我有一个垂直的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)

我从这里得到的代码:

正交投影矩阵的公式?

这似乎很好,但我希望我的起源在屏幕的左下角。这是一个我可以应用于矩阵的函数吗?这样一切都"正常工作",还是我必须手动将每个对象平移w/2 h/2?

旁注:坐标会与像素位置匹配吗?

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

glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

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

我还不完全熟悉投影,因为我最近才开始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值是选择的值。你可以按照自己认为合适的方式改变这些。

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

有关定义,请参阅维基百科。

最新更新