2013-11-27 267 views
1

我有一个ortho在2D的时刻设置,当我调整窗口的大小时,它会拉伸窗口中绘制的任何东西,有没有办法让窗口只显示黑色的时候窗口被调整大小或至少保持内容的纵横比,所以它们不会伸展。我已经尝试了一些我在这里看到的实现,但没有任何实际的工作。OpenGL防止在窗口调整大小

编辑:对不起球员有位金发碧眼的时刻,此刻

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

+0

当窗口改变尺寸时,请包括使用“正射影”图形投影矩阵设置的实际代码。为了按照你想要的方式工作,我希望在调整窗口大小之前和之后看到一些数学来补偿宽高比。 –

+0

已编辑!我确实尝试并结合纵横比,将测试值乘以宽度/高度,但它非常不礼貌,并未真正保持比例。 –

回答

0

我想出了我必须做的事情。不是利用在正交部分的纵横比,我用它观察口这样的:

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

这防止所有拉伸和简单地放置在右手侧上的黑条时的宽度大于高度。

0

的邻命令包括:​​以下参数:左,右,底部,顶部,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,我会建议使用0.1或更大的zNear。

+0

抱歉有一点,更新OP。 –

0

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

有一个讨论here on an old Gamedev thread