OpenGL 防止在调整窗口大小时拉伸

Posted

技术标签:

【中文标题】OpenGL 防止在调整窗口大小时拉伸【英文标题】:OpenGL prevent stretching on window resize 【发布时间】:2013-11-27 01:58:28 【问题描述】:

我目前为 2D 设置了正交,当我调整窗口大小时,它会拉伸窗口中绘制的任何内容,有没有办法在调整窗口大小时只显示黑条或至少保持内容的纵横比,因此它们根本不会拉伸。我已经尝试了一些我在这里看到的实现,但没有一个真正有效。

编辑:抱歉,伙计们有点金发碧眼

    Protected Overrides Sub OnResize(ByVal e As EventArgs)
        MyBase.OnResize(e)

        GL.Viewport(0, 0, Width, Height)

        GL.MatrixMode(MatrixMode.Projection)
        GL.LoadIdentity()
        GL.Ortho(-1.0, testvalue, testvalue , 1.0, 0.0, 4.0)
    End Sub 

此时的测试值为 5000,窗口大小为 800x800

【问题讨论】:

当窗口改变尺寸时,请包括您使用设置“正交”投影矩阵的实际代码。为了让它按照你想要的方式工作,我希望在调整窗口大小之前和之后看到一些数学来补偿纵横比。 已编辑!我确实尝试通过将测试值乘以宽度/高度来合​​并纵横比,但它非常狡猾,并没有真正保持比例。 【参考方案1】:

当您调整大小时,Windows 会创建自己的消息泵来处理事件,绕过您的消息泵。有一些变通方法(hacks)可以让它在调整大小时渲染,包括在线程上运行更新/渲染。请注意,这对于 D3D 和 OpenGL 来说都是一个问题。

有一个讨论here on an old Gamedev thread。

【讨论】:

【参考方案2】:

ortho 命令包括:​​以下参数:left、right、bottom、top、zNear、zFar 更多信息:http://www.opengl.org/sdk/docs/man2/xhtml/glOrtho.xml

您需要将“宽度”插入右侧,将“高度”插入底部,并确保“宽度”和“高度”值反映新的窗口大小。

例如:

GL.Viewport(0, 0, Width, Height)
GL.MatrixMode(MatrixMode.Projection)
GL.LoadIdentity()
GL.Ortho(0.0, Width, Height, 0.0, 1.0, 2.0)

由于您只是在 2D 之后,您的 zNear 和 zFar 可能非常小,请确保在 zNear 和 zFar 之间进行渲染,并且不要使用 0.0 作为您的 zNear,我建议您为您的 zNear 使用 0.1 或更大。

【讨论】:

【参考方案3】:

我知道我必须做什么。我没有在 Ortho 部分使用纵横比,而是在视口上使用它:

Dim ar As Single = Width/Height
GL.Viewport( 0, 0, 800 * ar, 800 * ar)

这可以防止所有拉伸,并且当宽度大于高度时,只需在右侧放置一个黑条。

【讨论】:

以上是关于OpenGL 防止在调整窗口大小时拉伸的主要内容,如果未能解决你的问题,请参考以下文章

调整窗口大小时如何使用鼠标单击获取图像坐标?

OPENGL如何在改变窗口大小时,使自己的图形不被拉伸保持自己的纵横比,把原理也解释下,不要只给代码

使用 OpenGL 和 SDL 处理窗口大小调整

opengl:调整大小时如何将对象保留在窗口中

OpenGL - 调整窗口大小时保持纵横比

OpenGL窗口大小渲染问题