You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码配置GLWpfControl遇OpenGL渲染异常:预期红色却显示黑色

问题描述

使用OpenTK在WPF纯代码(非XAML)环境下通过GLWpfControl进行局部OpenGL渲染时出现异常:

  • 预期GLWpfControl渲染为红色,实际显示黑色
  • 调用Start()后Render事件重复触发,但渲染结果无效
  • 不调用Start()时控件显示正常(非黑色)
  • 继承重写GLWpfControl后,DrawingContext绘制功能正常,但OpenGL功能仍失效

当前代码:

using System;
using System.Windows;
using OpenTK.Wpf;
using OpenTK.Graphics.OpenGL;
 
namespace Test {
    public class MyWindow : Window {
        
        [STAThread]
        public static void Main() {
            Application app = new Application();
            app.Run(new MyWindow());
        }

        public MyWindow() {
            GLWpfControl wpfControl = new GLWpfControl();
            wpfControl.Render += GLWpfOnRender;
    
            this.Content = wpfControl;

            var settings = new GLWpfControlSettings();
            wpfControl.Start(settings);
        }

        void GLWpfOnRender(TimeSpan delta) {
            Console.WriteLine(delta.TotalMilliseconds);
            GL.ClearColor(1.0f, 0.0f, 0.0f, 1.0f);
            GL.Clear(ClearBufferMask.ColorBufferBit); 
        }
    }
}

.csproj配置:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <RootNamespace>test_2</RootNamespace>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="OpenTK" Version="4.7.4" />
    <PackageReference Include="OpenTK.GLWpfControl" Version="4.2.2" />
  </ItemGroup>

</Project>
解决方案

1. 统一OpenTK版本

当前OpenTK(4.7.4)和OpenTK.GLWpfControl(4.2.2)版本不匹配,会导致上下文交互异常。将两个包版本统一为兼容版本,比如都使用4.7.4:
修改.csproj中的PackageReference:

<ItemGroup>
  <PackageReference Include="OpenTK" Version="4.7.4" />
  <PackageReference Include="OpenTK.GLWpfControl" Version="4.7.4" />
</ItemGroup>

2. 调整控件初始化顺序

纯代码环境下,需确保GLWpfControl布局完成后再启动渲染,否则OpenGL上下文可能未正确绑定。将Start()调用延迟到窗口加载完成后:
修改MyWindow构造函数:

public MyWindow() {
    GLWpfControl wpfControl = new GLWpfControl();
    wpfControl.Render += GLWpfOnRender;
    this.Content = wpfControl;

    // 延迟到窗口加载完成后启动GL渲染
    this.Loaded += (s, e) => {
        var settings = new GLWpfControlSettings();
        wpfControl.Start(settings);
    };
}

3. 确保渲染结果提交

在Render事件中,添加GL.Flush()和SwapBuffers()确保渲染结果提交到控件:
修改Render事件处理方法:

void GLWpfOnRender(TimeSpan delta) {
    Console.WriteLine(delta.TotalMilliseconds);
    GL.ClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    GL.Clear(ClearBufferMask.ColorBufferBit);
    // 提交渲染命令并交换缓冲区
    GL.Flush();
    ((GLWpfControl)sender).SwapBuffers();
}

完整修改后代码

using System;
using System.Windows;
using OpenTK.Wpf;
using OpenTK.Graphics.OpenGL;
 
namespace Test {
    public class MyWindow : Window {
        
        [STAThread]
        public static void Main() {
            Application app = new Application();
            app.Run(new MyWindow());
        }

        public MyWindow() {
            GLWpfControl wpfControl = new GLWpfControl();
            wpfControl.Render += GLWpfOnRender;
            this.Content = wpfControl;

            this.Loaded += (s, e) => {
                var settings = new GLWpfControlSettings();
                wpfControl.Start(settings);
            };
        }

        void GLWpfOnRender(TimeSpan delta) {
            Console.WriteLine(delta.TotalMilliseconds);
            GL.ClearColor(1.0f, 0.0f, 0.0f, 1.0f);
            GL.Clear(ClearBufferMask.ColorBufferBit);
            GL.Flush();
            ((GLWpfControl)sender).SwapBuffers();
        }
    }
}

内容的提问来源于stack exchange,提问作者user19591202

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:45:55