opengl 调整窗口大小时OpenTK重绘

yvgpqqbh  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(293)

我正在编写一个使用OpenTK作为其图形库的项目。
当我调整OpenTK.GameWindow的大小时,框架直到光标被释放后才会更新。结果,部分视口要么被裁剪(当尺寸变小时),要么被黑色填充(当尺寸变大时)。我目前正在遵循learn OpenTK tutorial,并已经完成了一个三角形的绘制,并派生了一个新的OpenTK.GameWindow子类。
下面是我用绘图逻辑覆盖的一些OpenTK.GameWindow事件:

  1. protected override void OnLoad(EventArgs e)
  2. {
  3. GL.ClearColor(0.2f, 0.3f, 0.3f, 1.0f);
  4. VertexBufferObject = GL.GenBuffer();
  5. GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
  6. GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);
  7. shader = new Shader("Shaders\\shader.vert", "Shaders\\shader.frag");
  8. shader.Use();
  9. VertexArrayObject = GL.GenVertexArray();
  10. GL.BindVertexArray(VertexArrayObject);
  11. GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
  12. GL.EnableVertexAttribArray(0);
  13. GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
  14. base.OnLoad(e);
  15. }
  16. protected override void OnUnload(EventArgs e)
  17. {
  18. GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
  19. GL.BindVertexArray(0);
  20. GL.UseProgram(0);
  21. GL.DeleteBuffer(VertexBufferObject);
  22. GL.DeleteBuffer(VertexArrayObject);
  23. shader.Dispose();
  24. base.OnUnload(e);
  25. }
  26. protected override void OnRenderFrame(FrameEventArgs e)
  27. {
  28. GL.Clear(ClearBufferMask.ColorBufferBit);
  29. shader.Use();
  30. GL.BindVertexArray(VertexArrayObject);
  31. GL.DrawArrays(PrimitiveType.Triangles, 0, 3);
  32. Context.SwapBuffers();
  33. base.OnRenderFrame(e);
  34. }
  35. protected override void OnResize(EventArgs e)
  36. {
  37. GL.Viewport(0, 0, Width, Height);
  38. base.OnResize(e);
  39. }

我应该在OnUpdateFrame中加入一些逻辑来解决这个问题吗?看起来OnResize直到窗口不再被调整大小时才触发。
似乎有some information返回的谷歌关于这个主题,我不知道如何跟进:
在某些平台上,窗口移动、调整大小或菜单操作将导致事件处理阻塞。这是由于这些平台上事件处理的设计方式所致。在此类操作过程中,您可以在必要时使用窗口刷新回调来重绘窗口内容。

ruyhziif

ruyhziif1#

尝试使用

  1. protected override void OnResize (ResizeEventArgs e)
  2. {
  3. GL.Viewport (0, 0, Size.X, Size.Y);
  4. base.OnResize (e);
  5. }

而不是

  1. protected override void OnResize(EventArgs e)
  2. {
  3. GL.Viewport(0, 0, Width, Height);
  4. base.OnResize(e);
  5. }

OpenTK已经有高度和宽度值 分配给已创建的窗口

展开查看全部

相关问题