在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
在CPF里使用OpenGL做跨平台桌面应用开发的更多相关文章
- Mac > 编写跨平台桌面应用开发工具,基于 Web 技术
Electron: The Electron framework lets you write cross-platform desktop applications using JavaScript ...
- 快速了解Electron:新一代基于Web的跨平台桌面技术
本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的 ...
- 原创|我是如何从零学习开发一款跨平台桌面软件的(Markdown编辑器)
原始冲动 最近一直在学习 Electron 开发桌面应用程序,目的是想做一个桌面编辑器,虽然一直在使用Typore这款神器,但无奈Typore太过国际化,在国内水土不服,无法满足我的一些需求. 比如实 ...
- 我是如何从零学习开发一款跨平台桌面软件的(Markdown编辑器)
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 原始冲动 最近一 ...
- 基于Electron+.NET Core的前后端分离的跨平台桌面应用
Web做界面比原生桌面界面开发速度真心要快很多,而且组件也多. 分析: 1..NET Core和Electron都是跨平台的. 2.NET Core做后端很方便,但是没有GUI,Electron做桌面 ...
- NetCore跨平台桌面框架Avalonia的OSX程序打包
虽然工作开发语言已经转到了java,但平时仍会用netcore做一些小工具,提升工作效率,但是笔记本换成了Mac,小工具只能做成命令行形式,很是痛苦,迫切需要一个.net跨平台的桌面程序解决方案. 为 ...
- 使用nodegui 开发高性能的跨平台桌面端应用
nodegui 是基于qt + nodejs 的跨平台桌面开发方案,官方同时也提供了很不错的文档 简单使用 使用官方的starter clone 代码 git clone https://github ...
- .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。
介绍: 目前微软还没有跨平台桌面程序的开发框架.github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia.avalonia 采用 Xaml+C#,类似于wpf,可运行于.netf ...
- Electron+Vue开发跨平台桌面应用
Electron+Vue开发跨平台桌面应用 xiangzhihong发布于 2019-12-23 虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某 ...
- Electron+React+七牛云 实战跨平台桌面应用(最新更新)
课程资料获取链接:点击这里 前市场上对 Electron 的呼声很高,它几乎是 Web 开发人员开发桌面客户端的唯一途径,很多大厂都使用 Electron 开发自己的原生应用.Electron 天生适 ...
随机推荐
- 「BJWC2012」冻结题解
「BJWC2012」冻结题解 一.题目 "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中 ...
- DeferredResult异步处理spring mvc Demo
一.概述 spring mvc同步接口在请求处理过程中一直处于阻塞状态,而异步接口可以启用后台线程去处理耗时任务.简单来说适用场景: 1.高并发: 2.高IO耗时操作. 二.Demo Spring M ...
- 数据库sql中处理时间冲突问题
数据库现有数据其中两列: s - 开始时间, e - 结束时间. 在新插入数据s', e'之前需要判断两个时间之间是否有重合 因为使用mybatis-plus的缘故, 结论都使用s或e在符号前面. 1 ...
- 《机器人SLAM导航核心技术与实战》第1季:第6章_机器人底盘
<机器人SLAM导航核心技术与实战>第1季:第6章_机器人底盘 视频讲解 [第1季]6.第6章_机器人底盘-视频讲解 [第1季]6.1.第6章_机器人底盘_底盘运动学模型-视频讲解 [第1 ...
- oauth2单点登录集成
单点登陆 概念: 单点登录其实就是在多个系统之间建立链接, 打通登录系统, 让同一个账号在多个系统中通用 举个例子: 登录Gmail的时候可以用账号密码登录, 也可以用google账号登录, 而使用g ...
- cv2 数学基础---矩阵微分
矩阵微分基础知识 定义 重要结论 应用 定义 (1) 向量对标量求导 矩阵对标量求导 我们可以看到上述求导过程实际上就是不同函数对变量求导,然后按照向量或者矩阵的形式排列,注意这里结果的结构应该与函数 ...
- 虹科技术|Redis企业版数据库:实现金融服务IT现代化!
随着新冠肺炎和技术创新推动企业进入新的数字时代,金融行业客户现在需要一种快速.简单且根据需求量身定制的数字银行体验.这就需要银行进行转型,以提供更加数字化的服务,但无论战略.方法,还是满足消费者极高期 ...
- zabbix监控Tomcat/JVM 实例性能
1.背景 zabbix-4.0 环境已部署好 JDK .Tomcat环境已部署好 2.配置Tomcat JMX 编辑catalina.sh加入以下配置 # vim /usr/local/tomcat/ ...
- 导出所有容器id号
#!/bin/bash a=`docker ps|awk 'NR>1{print $1}'` FORMAT="%-12s\t,\t%-12s\t,\t%-12s\n" pri ...
- js前端操作,c#后端下发xml文件
前端: var xmlLanguageDoc; $.ajax({ url: "/GiveMeXML",//此处可随意定义,不一定是路径.在c# ,请求被捕获后,由c ...