我在openGL中的标准化正交坐标有什么问题

What is wrong with my normalized orthographic coordinates in openGL?

本文关键字:坐标 什么 问题 openGL 标准化 我在      更新时间:2023-10-16

我正试图在openGL中创建一个三角形,当我调整窗口大小时,它不会拉伸。我将此正交矩阵传递给顶点着色器。

void resize(int w, int h) {
float orthMat[4][4];
orthMat[0][0] = 2.0/w;
orthMat[1][1] = -2.0/h;
orthMat[3][3] = 1.0;
orthMat[3][3] = 1.0;
orthMat[3][0] = -1.0;
orthMat[3][1] = -1.0;
orthMat[0][1] = 0.0;
orthMat[0][2] = 0.0;
orthMat[0][3] = 0.0;
orthMat[1][0] = 0.0;
orthMat[1][3] = 0.0;
orthMat[1][2] = 0.0;
orthMat[2][0] = 0.0;
orthMat[2][1] = 0.0;
orthMat[2][2] = 0.0;
orthMat[2][3] = 0.0;
orthMat[3][2] = 0.0;
glUniformMatrix4fv(uniformLocationIndex, 1, GL_TRUE, &orthMat[0][0]);
glViewport(0,0,w,h);
}

uniformLocationIndex指向我的顶点着色器中的"projMat"。

#version 330
in vec2 position;
in mat4 projMat;
void main() { 
    //vec4 contains normalized x and y coordinates
    gl_Position =  projMat * vec4(((-1.0) + position.x*(2.0/(2.0/projMat[0][0]))),
                                     (1.0 - position.y*(2.0/(-2.0/projMat[1][1]))),
                                     0.0, 1.0);
}

无论我把点放在哪里,它们都会指向中心,并且在调整窗口大小时无法正确缩放。它应该保持纵横比并缩小比例。

我做了一些数学运算,我认为问题在于着色器计算。

我用创建了一个投影矩阵

左剪裁平面=-1右侧剪裁平面=1顶部剪裁平面=1底部剪裁平面=-1近剪裁平面=0.001远裁剪平面=2

将我创建的这个矩阵与您的矩阵进行比较,第2行和第3行存在显著差异,但由于看起来您没有使用这些矩阵,因此我忽略了这一点。

然后我做了gl_Position计算中涉及的数学运算,除非我弄错了,否则我得到了:

点(1,1)转换为(0,0)
点(1,-1)转换为(0,2)(在视野外)
点(-1,1)转换为(-2,0)(视野外)
点(-1,-1)转换为(-2,2)(视野外)

我认为你的矩阵中没有第2行和第3行(0和1看起来不错),但同样,由于你没有使用它们,如果你在着色器中说这样的话,你应该能够通过:

vec4 Position = projMat * vec4(position, 0.0, 1.0);
gl_Position = vec4(Position.x, Position.y, 0.0, 1.0);