求助:C# OpenTK程序OpenGL绘图区域调整大小时消失
我之前在多显卡笔记本上碰到过类似的OpenTK窗口缩放异常问题,结合你的情况,分享几个可能的原因和解决思路:
双显卡切换导致的上下文异常
戴尔Inspiron这类双显卡笔记本(核显+独显)经常会在窗口状态变化时自动切换显卡,而OpenTK的GlControl可能没有正确处理这种上下文切换。很多时候系统会默认把WinForms控件类的OpenGL应用分配给核显,而Intel UHD的老驱动对OpenGL视口、上下文状态的处理存在兼容性bug。窗口Resize时未重置视口
哪怕你只调用GL.Clear(),当窗口尺寸改变后,OpenGL的视口(Viewport)并没有自动更新到新的窗口大小,导致清屏操作的区域和实际显示区域不匹配,看起来就是“无画面”。你可以在窗口的Resize事件里添加视口重置代码:private void GlControl_Resize(object sender, EventArgs e) { var control = sender as GLControl; if (control != null && control.Context.IsCurrent) { GL.Viewport(0, 0, control.Width, control.Height); // 手动触发一次渲染 control.Invalidate(); } }驱动版本兼容性问题
Intel UHD显卡的旧驱动对OpenGL的支持确实存在不少坑,尤其是和OpenTK这类封装库结合时。建议你直接去Intel官网下载对应型号的最新核显驱动(不要依赖戴尔官网的驱动,往往更新不及时),同时把NVIDIA 940m的驱动也更新到最新版本,很多这类显示异常都是驱动bug导致的。强制指定高性能显卡运行
右键你的应用程序,选择「用图形处理器运行」→「高性能NVIDIA处理器」,强制让应用使用独显运行。有些笔记本会默认把WinForms应用分配给核显,哪怕你用到了OpenGL,强制切换后可能会解决问题。
我之前遇到的类似情况,就是核显驱动的视口处理bug加上Resize时未重置视口导致的,添加视口代码并更新驱动后就完全解决了。
内容的提问来源于stack exchange,提问作者szamil

