首页 > 其他分享 >在CPF里使用OpenGL做跨平台桌面应用开发

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

时间:2023-12-05 12:13:48浏览次数:24  
标签:OpenGL args GLView CPF 跨平台 new 绘制

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

标签:OpenGL,args,GLView,CPF,跨平台,new,绘制
From: https://www.cnblogs.com/dskin/p/17876277.html

相关文章

  • SkiaSharp库在NetCore下跨平台图片操作基础使用方法
    SkiaSharp库在NetCore下跨平台图片操作基础使用方法:在跨平台开发中,处理图片是一项常见的需求。而SkiaSharp库是一个强大的工具,它提供了在NetCore平台下进行跨平台图片操作的能力。本文将介绍SkiaSharp库在NetCore下的基础使用方法,以及逐步深入的高级功能。什么是SkiaSharp?SkiaS......
  • 一个基于.NET Core开源、跨平台的仓储管理系统
    前言今天给大家推荐一个基于.NETCore开源、跨平台的仓储管理系统,数据库支持MSSQL/MySQL:ZEQP.WMS。仓储管理系统介绍仓储管理系统(WarehouseManagementSystem,WMS)是一种用于管理和控制仓库操作的软件系统,它可以帮助企业实现对仓库内物品的跟踪、存储、拣选、包装和发运等全过程......
  • Go语言开源跨平台GUI框架Fyne小教程|数据绑定篇
    入门数据绑定是在Fyne工具包v2.0.0版本中引入的的一个强大功能。通过使用数据绑定,我们可以避免手动管理许多标准对象,如标签、按钮和列表等,的数据内容。Fyne内置绑定支持许多基本数据类型(如Int、String、Float等),还有列表(如StringList、BoolList)以及Map和Struct绑定。这些类型中的每......
  • CPF C#跨平台UI框架开源了
    介绍C#跨平台UI框架提供NETStandard2.0和net4的库,通过Netcore可以跨平台,支持Windows、Mac、Linux,Net4的可以支持XP。各个平台运行效果一致,不依赖系统控件。支持窗体,控件任意透明,支持异形窗体,支持SVG图标显示。支持动画,数据绑定,Mvvm模式,CSS等,简化依赖属性,数据绑定的写法,提供数......
  • CSE 167 3DOpenGL 开发
    我们将在本作业中开发一个用于检查3D模型的交互式界面。正如您可能从以前的家庭作业中了解到的那样,渲染需要在数百万像素和数十亿三角形。这会给性能带来重大挑战,尤其是在我们希望与内容实时交互。为了让事情变得更快,计算机图形学的先驱们提出了使用特定领域硬件加速渲染的解决......
  • 在OpenGL中使用Dear ImGui
    在众多GUI库中,DearImGui用起来最简单,它很容易集成到程序中,绘制的窗口看起来也还不错。可以用它画出非常炫酷的GUI界面:而我则不同:无论使用哪个GUI库,画出来的窗口都惨不忍睹。下面简要介绍如何在OpenGL中使用DearImGui. 1.DearImGui简介以下是DearImGui的相关链接:源代......
  • Avalonia 实现跨平台的IM即时通讯、语音视频通话(源码,支持信创国产OS,统信、银河麒麟)
       在Avalonia如火如荼的现在,之前使用CPF实现的简单IM,非常有必要基于Avalonia来实现了。Avalonia在跨平台上的表现非常出色,对信创国产操作系统(像银河麒麟、统信UOS、Deepin等)也很不错。   现在,我们就来使用Avalonia实现一个跨平台的简单IM,除了文字聊天外,还可......
  • opengl开发:win11已阻止应用程序访问图形硬件如何处理?
     开发中出现这种问题: 请到设置里面搜索:图形设置,浏览,加入exe,选择选项然后设置。不要选择让windows决定即可。 ......
  • TGFX-跨平台 2D 绘图引擎
    1、项目简介TGFX(TencentGraphics)是一个跨平台的纯GPU绘图引擎,提供了完备的图片,矢量和文本的2D绘制能力,目前已支持:iOS,Android,macOS,Windows,Linux,以及Web等平台。它最初是从PAG动效开源项目中孵化而来,作为谷歌Skia绘图引擎的轻量化替代方案,以仅400K左右的包......
  • 最佳实践-使用Github Actions来构建跨平台容器镜像
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。前言最近在写K8s的相关系列文章,因为有涉及到镜像构建,发现在Macm1的Arm架构下构建的部分镜像,没法在X86架构下使用,不兼容。尝试网上介绍的各种方式,都已失败告终,效果如下:最终还是Github的Actions......