原产正投影屏幕在左下角(Orthographic projection with origin at

2019-07-03 21:18发布

我使用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)

该代码我从这里得到:

式为一个正交投影矩阵?

这似乎很好地工作,但我想我的原产地是在屏幕的左下角。 这是我可以申请在我的矩阵,一切“只是工程”的功能,还是必须由我手动W / 2小时/ 2中的每个对象翻译?

边注:请问坐标匹配这个像素位置正常工作?

因为我使用OpenGL的现代技术,我不认为我应该使用gluOrtho2d或GL_PROJECTION电话。

Answer 1:

我不完全熟悉的预测还没有,因为我是最近才开始的OpenGL编程,但当前的矩阵没有把任何点。 对角线将适用比例,但最右边的列将申请转换。 德克给的链接给你的投影矩阵,这将使你的原点(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值是选择了让他们的人。 你怎么看适合你可以改变这些。



Answer 2:

你可以使用另外使用左,右位置的更一般的投影矩阵。

请参见维基百科的定义。



Answer 3:

glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix)

你的矩阵存储在行优先排序。 所以,你应该通过GL_TRUE,或者您应将矩阵变为列重大。



文章来源: Orthographic projection with origin at screen bottom left