2015-09-06 67 views
0

我还是OpenGL的初学者。我正在使用着色器在屏幕尺寸1280乘720处画一个完美的正方形。OpenGL视口失真

我使用的OpenGL核心配置文件,版本3.3。 我坚持了这个,当我试图通过720

enter image description here

绘制一个正方形在1280后搜索的一段时间,我意识到,大小由视口大小扭曲,改变视口大小后720乘720,我得到了这个。

This is in a viewport with size of 720 by 720

在传统的OpenGL,他们有一个solution来解决这个问题,但现在它在核心配置文件过时。

问题:如何在1280 x 720屏幕尺寸下绘制完美的正方形,仅使用核心配置文件OpenGL 3.3?

+2

你需要做同样的事情。应用正交投影变换。在你的情况,只是在着色器。 –

+0

@NicoSchertler着色器是否有这样的功能?或者我必须计算自己? – kimnod

+0

着色器没有内部解决方案,购买可以使用外部库,如glm。 http://glm.g-truc.net/0.9.7/index.html –

回答

0

按比例缩小(2.0/width, 2.0/height)。如果您有相机矩阵,只需将其乘以该比例。

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

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); 
} 

这需要两个窗口尺寸与视口的大小越大,并且延伸视口超出窗口中的其他尺寸,以产生方视口。