我还是OpenGL的初学者。我正在尝试使用着色器在屏幕尺寸1280 x 720上绘制一个完美的正方形。
我正在使用OpenGL核心配置文件3.3版。 当我试图在1280乘720
画一个正方形时,我被困在这里经过一段时间的搜索后,我意识到视口大小会导致视图大小失真,将视口大小更改为720×720后,我就明白了。
在传统的OpenGL中,他们有一个solution来解决这个问题,但现在它已在Core配置文件中弃用。
问题:如何使用核心配置文件OpenGL 3.3在1280 x 720屏幕大小中绘制完美的正方形?
答案 0 :(得分:1)
应用投影变换是解决此问题的最标准方法。您可以在几乎所有教程中找到有关如何执行此操作的详细信息,该教程介绍如何将OpenGL与着色器一起使用。总之,您通常在顶点着色器中将投影矩阵作为一个统一变量,并将其应用于输入位置:
uniform mat4 ProjMat;
in vec4 InPosition;
...
gl_Position = ProjMat * InPosition;
在C ++代码中,您计算矩阵以应用必要的缩放,并使用glUniformMatrix4fv()
进行设置。
另一个选择是保持视口方块。虽然视口通常设置为与窗口大小相匹配,但 的情况并非如此。例如,视口可以超出窗口的大小。
要使用此方法,您可以在代码中设置视口以响应窗口(重新)大小事件。使用w
和h
窗口的宽度和高度:
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)
缩放所有内容。如果你有一个相机矩阵,只需将它与这个缩放相乘。
使用该变换,您可以将位置输入为像素,原点位于屏幕中间。