【问题标题】:OpenGL prevent stretching on window resizeOpenGL 防止在调整窗口大小时拉伸
【发布时间】: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

【问题讨论】:

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

标签: vb.net opengl opentk


【解决方案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)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多