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

时间:2015-02-13 03:42:18

标签: c++ opengl

我正在尝试在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 个答案:

答案 0 :(得分: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);