OpenGL防止窗口调整大小拉伸

时间:2013-11-27 01:58:28

标签: vb.net opengl opentk

我现在正在为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

3 个答案:

答案 0 :(得分:0)

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

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

E.g:

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或更大。

答案 1 :(得分:0)

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

有一个讨论here on an old Gamedev thread

答案 2 :(得分:0)

我想出了我必须做的事情。我没有在Ortho部件上使用纵横比,而是在视口上使用它:

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

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