OpenGL视口失真

时间:2015-09-06 07:51:39

标签: c++ opengl opengl-3

我还是OpenGL的初学者。我正在尝试使用着色器在屏幕尺寸1280 x 720上绘制一个完美的正方形。

我正在使用OpenGL核心配置文件3.3版。 当我试图在1280乘720

画一个正方形时,我被困在这里

enter image description here

经过一段时间的搜索后,我意识到视口大小会导致视图大小失真,将视口大小更改为720×720后,我就明白了。

This is in a viewport with size of 720 by 720

在传统的OpenGL中,他们有一个solution来解决这个问题,但现在它已在Core配置文件中弃用。

问题:如何使用核心配置文件OpenGL 3.3在1280 x 720屏幕大小中绘制完美的正方形?

2 个答案:

答案 0 :(得分:1)

应用投影变换是解决此问题的最标准方法。您可以在几乎所有教程中找到有关如何执行此操作的详细信息,该教程介绍如何将OpenGL与着色器一起使用。总之,您通常在顶点着色器中将投影矩阵作为一个统一变量,并将其应用于输入位置:

uniform mat4 ProjMat;
in vec4 InPosition;
...
    gl_Position = ProjMat * InPosition;

在C ++代码中,您计算​​矩阵以应用必要的缩放,并使用glUniformMatrix4fv()进行设置。

另一个选择是保持视口方块。虽然视口通常设置为与窗口大小相匹配,但 的情况并非如此。例如,视口可以超出窗口的大小。

要使用此方法,您可以在代码中设置视口以响应窗口(重新)大小事件。使用wh窗口的宽度和高度:

if (w > h) {
    glViewport(0, (h - w) / 2, w, w);
} else {
    glViewport((w - h) / 2, 0, h, h);
}

这会将两个窗口尺寸中的较大者作为视口大小,并将视口扩展到另一个维度中的窗口之外,以生成方形视口。

答案 1 :(得分:0)

(2.0/width, 2.0/height)缩放所有内容。如果你有一个相机矩阵,只需将它与这个缩放相乘。

使用该变换,您可以将位置输入为像素,原点位于屏幕中间。