Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net OpenGL防止在调整窗口大小时拉伸_Vb.net_Opengl_Opentk - Fatal编程技术网

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

Vb.net OpenGL防止在调整窗口大小时拉伸,vb.net,opengl,opentk,Vb.net,Opengl,Opentk,我现在已经为2D设置了一个正交,当我调整窗口大小时,它会拉伸窗口中绘制的任何内容,有没有办法在调整窗口大小时只显示黑色条,或者至少保持内容的纵横比,这样它们就不会拉伸。我已经尝试了一些我在这里看到的实现,但是没有什么真正起作用 编辑:对不起,男人们有点金发的时候 Protected Overrides Sub OnResize(ByVal e As EventArgs) MyBase.OnResize(e) GL.Viewport(0, 0, Width

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

此时的testvalue为5000,窗口大小为800x800

正交命令由以下参数组成:左、右、下、上、zNear、zFar进一步信息:

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

例如:


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

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


有一场讨论。

我想出了我该做什么。我没有在正交零件上使用纵横比,而是在视口上使用它:

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

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

当窗口更改尺寸时,请包括您正在使用的设置“正交”图形投影矩阵的实际代码。为了让它按照您想要的方式工作,我希望看到一些数学来补偿窗口大小调整前后的纵横比。编辑!我确实尝试过通过将测试值乘以宽度/高度来合并纵横比,但这是非常不可靠的,并没有真正保持这个比例。
Dim ar As Single = Width/Height
GL.Viewport( 0, 0, 800 * ar, 800 * ar)