在CPF里使用OpenGL做跨平台桌面应用开发

CPF 是开源的C#跨平台UI框架,支持使用OpenGL来渲染,可以用来硬件加速播放视频或者显示3D模型

实现原理其实就是Skia用OpenGL后端,Skia里绑定GLView的OpenGL纹理,将纹理作为Skia的图像混合绘制。

在CPF里使用OpenGL,不能选择NetCore3.0和Net4,需要选择Netcore3.1以及之后的版本。

Nuget里安装最新版的CPF。另外安装Silk.NET或者OpenTK来调用OpenGL绘制。

Program里需要开启GPU,设置 UseGPU = true

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Application.Initialize(
                (OperatingSystemType.Windows, new WindowsPlatform(), new SkiaDrawingFactory { UseGPU = true })
                , (OperatingSystemType.OSX, new CPF.Mac.MacPlatform(), new SkiaDrawingFactory { UseGPU = true })//如果需要支持Mac才需要
                , (OperatingSystemType.Linux, new CPF.Linux.LinuxPlatform(), new SkiaDrawingFactory { UseGPU = true })//如果需要支持Linux才需要
            );
            Application.Run(new Window2_1_Colors());
        }
    }

界面上添加 CPF.Skia.GLView 控件,GLLoaded为GL加载完成事件,GLRender为GL绘制事件。OpenGL就在这两个事件里处理

            Children.Add(new WindowFrame(this, new GLView
            {
                Width = "100%",
                Height = "100%",
                [nameof(GLView.GLLoaded)] = new CommandDescribe((s, e) => GLLoaded((GLView)s, (GLEventArgs)e)),
                [nameof(GLView.GLRender)] = new CommandDescribe((s, e) => GLRender((GLView)s, (GLEventArgs)e)),
                [nameof(GLView.MouseDown)] = new CommandDescribe((s, e) => MouseEvent((GLView)s, (MouseEventArgs)e)),
                [nameof(GLView.MouseUp)] = new CommandDescribe((s, e) => MouseEvent((GLView)s, (MouseEventArgs)e)),
                [nameof(GLView.MouseMove)] = new CommandDescribe((s, e) => MouseEvent((GLView)s, (MouseEventArgs)e)),
            })
            {
                MaximizeBox = true
            });

Silk.Net初始化API

        GL gl;//可以保存为全局的字段
        void GLLoaded(GLView view, GLEventArgs args)
        {
            gl = GL.GetApi(args.Context.GetProcAddress);
        }

OpenTk初始化API

    class Context : OpenTK.IBindingsContext
    {//定义API绑定的上下文
        public IGlContext context;
        public IntPtr GetProcAddress(string procName)
        {
            return context.GetProcAddress(procName);
        }
    }

        void GLLoaded(GLView view, GLEventArgs args)
        {//初始化一次就行
             GL.LoadBindings(new Context { context = args.Context });
        }

在GLRender事件里绘制。默认情况下GLRender不会一直调用,因为绘制方式不是游戏那种实时刷新的。需要刷新的时候要主动调用Invalidate(),或者用定时器来实时调用Invalidate()。

        void GLRender(GLView view, GLEventArgs args)
        {
            gl.Enable(GLEnum.DepthTest);//开启深度测试
            gl.DepthMask(true);

            //其他绘制代码。。。。


            //开启深度测试之后要关闭,否则会无法显示界面,同样的,如果开启了其他功能,绘制结束后记得关闭,否则可能影响界面绘制。因为和界面共享OpenGL的上下文。
            gl.Disable(GLEnum.DepthTest);
        }

 

具体OpenGL的绘制教程你可以直接找Silk.NET或者OpenTK的教程就行。

运行效果

 

案例源码下载:CPF_OpenGL

CPF开源地址:https://gitee.com/csharpui/CPF

相关推荐

  1. Electron 平台桌面应用开发工具

    2023-12-05 14:27:16       23 阅读
  2. 平台应用开发神器Uniapp

    2023-12-05 14:27:16       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-05 14:27:16       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-05 14:27:16       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-05 14:27:16       82 阅读
  4. Python语言-面向对象

    2023-12-05 14:27:16       91 阅读

热门阅读

  1. 深度解析C#中LinkedList的存储结构

    2023-12-05 14:27:16       45 阅读
  2. JeecgBoot 框架升级至 Spring Boot3 的实战步骤

    2023-12-05 14:27:16       62 阅读
  3. RabbitMQ高可用集群的搭建部署(Centos7)

    2023-12-05 14:27:16       43 阅读
  4. c语言实现this指针效果

    2023-12-05 14:27:16       62 阅读
  5. [编程] 你真的会写函数注释?这里给你一个答案

    2023-12-05 14:27:16       54 阅读
  6. 带团队后的日常思考(十三)

    2023-12-05 14:27:16       55 阅读
  7. 在NET8中使用简化的 AddJwtBearer 认证

    2023-12-05 14:27:16       54 阅读
  8. 基于DotNetty实现一个接口自动发布工具 - 背景篇

    2023-12-05 14:27:16       55 阅读
  9. 第二周的鲜花

    2023-12-05 14:27:16       48 阅读
  10. seafile获取token和文件夹ID

    2023-12-05 14:27:16       48 阅读
  11. 9

    9

    2023-12-05 14:27:16      42 阅读
  12. 97、Cell防止复用的两种方法

    2023-12-05 14:27:16       54 阅读
  13. 07

    07

    2023-12-05 14:27:16      46 阅读