C# 调整窗口大小时重新绘制OpenTK
我正在写一个使用OpenTK作为图形库的项目C# 调整窗口大小时重新绘制OpenTK,c#,opengl,opentk,C#,Opengl,Opentk,我正在写一个使用OpenTK作为图形库的项目 当我调整一个OpenTK.GameWindow的大小时,直到释放光标,框架才会更新。因此,视口的某些部分要么被剪裁(当尺寸较小时),要么被黑色填充(当尺寸较大时)。我目前正在学习,并且已经完成了绘制三角形的工作,已经派生了一个新的子类OpenTK.GameWindow 下面是我用绘图逻辑覆盖的一些OpenTK.GameWindow事件: protected override void OnLoad(EventArgs e) {
当我调整一个
OpenTK.GameWindow
的大小时,直到释放光标,框架才会更新。因此,视口的某些部分要么被剪裁(当尺寸较小时),要么被黑色填充(当尺寸较大时)。我目前正在学习,并且已经完成了绘制三角形的工作,已经派生了一个新的子类OpenTK.GameWindow
下面是我用绘图逻辑覆盖的一些OpenTK.GameWindow
事件:
protected override void OnLoad(EventArgs e)
{
GL.ClearColor(0.2f, 0.3f, 0.3f, 1.0f);
VertexBufferObject = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);
shader = new Shader("Shaders\\shader.vert", "Shaders\\shader.frag");
shader.Use();
VertexArrayObject = GL.GenVertexArray();
GL.BindVertexArray(VertexArrayObject);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
base.OnLoad(e);
}
protected override void OnUnload(EventArgs e)
{
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
GL.UseProgram(0);
GL.DeleteBuffer(VertexBufferObject);
GL.DeleteBuffer(VertexArrayObject);
shader.Dispose();
base.OnUnload(e);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
GL.Clear(ClearBufferMask.ColorBufferBit);
shader.Use();
GL.BindVertexArray(VertexArrayObject);
GL.DrawArrays(PrimitiveType.Triangles, 0, 3);
Context.SwapBuffers();
base.OnRenderFrame(e);
}
protected override void OnResize(EventArgs e)
{
GL.Viewport(0, 0, Width, Height);
base.OnResize(e);
}
我应该在OnUpdateFrame
中加入一些逻辑来解决这个问题吗?在窗口不再调整大小之前,OnResize
似乎不会触发
谷歌似乎返回了关于这个主题的信息,我不确定如何跟进:
在某些平台上,窗口移动、调整大小或菜单操作将导致事件处理阻塞。这是由于在这些平台上如何设计事件处理。在此类操作期间,如有必要,可以使用窗口刷新回调重新绘制窗口的内容
“因此,视口的某些部分要么被剪裁(当尺寸变小时)要么被黑色填充(当尺寸变大时)。”这绝对是正常的窗口行为。画画时重画是一个非常糟糕的主意。重画是非常昂贵的。在调整大小的过程中,每增加/删除一个像素,您就必须执行一次在游戏中,你通常不会拖动窗口来获得分辨率。您可以从下拉列表中选择一组值。@Christopher:为什么不好?一个典型的游戏会以显示器刷新率重画,窗口的大小是否会更频繁地改变?@Andrea如果你每像素重画一次?你可以打赌它比刷新率高。它现在的工作方式完全足够了。也许他应该完全禁用拖动,让分辨率从下拉列表中选择。大多数游戏似乎都是这样。特别是那些窗口模式。我假设你有某种每秒运行多次的渲染循环/回调。您可以在每次更改新窗口大小时记录它,但只能在正常情况下重新绘制。这应该是顺利的,我认为即使是一些令人信服的假调整大小的方法在我的用例中也可以。相对而言,我不会画很多对象。因此,如果有一种方法可以在部分中绘制一些低LOD,这将变成黑色,那将是完美的。