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 防止在调整窗口大小时拉伸的主要内容,如果未能解决你的问题,请参考以下文章