我正在尝试在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);
}
无论我把点放在哪里,当我调整窗口大小时,它们都会到达中心并且无法正确缩放。假设保持纵横比和缩小比例。
答案 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);