经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
在CPF里使用OpenGL做跨平台桌面应用开发
来源:cnblogs  作者:DSkin  时间:2023/12/5 12:07:27  对本文有异议

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

  1. class Program
  2. {
  3. [STAThread]
  4. static void Main(string[] args)
  5. {
  6. Application.Initialize(
  7. (OperatingSystemType.Windows, new WindowsPlatform(), new SkiaDrawingFactory { UseGPU = true })
  8. , (OperatingSystemType.OSX, new CPF.Mac.MacPlatform(), new SkiaDrawingFactory { UseGPU = true })//如果需要支持Mac才需要
  9. , (OperatingSystemType.Linux, new CPF.Linux.LinuxPlatform(), new SkiaDrawingFactory { UseGPU = true })//如果需要支持Linux才需要
  10. );
  11. Application.Run(new Window2_1_Colors());
  12. }
  13. }

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

  1. Children.Add(new WindowFrame(this, new GLView
  2. {
  3. Width = "100%",
  4. Height = "100%",
  5. [nameof(GLView.GLLoaded)] = new CommandDescribe((s, e) => GLLoaded((GLView)s, (GLEventArgs)e)),
  6. [nameof(GLView.GLRender)] = new CommandDescribe((s, e) => GLRender((GLView)s, (GLEventArgs)e)),
  7. [nameof(GLView.MouseDown)] = new CommandDescribe((s, e) => MouseEvent((GLView)s, (MouseEventArgs)e)),
  8. [nameof(GLView.MouseUp)] = new CommandDescribe((s, e) => MouseEvent((GLView)s, (MouseEventArgs)e)),
  9. [nameof(GLView.MouseMove)] = new CommandDescribe((s, e) => MouseEvent((GLView)s, (MouseEventArgs)e)),
  10. })
  11. {
  12. MaximizeBox = true
  13. });

Silk.Net初始化API

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

OpenTk初始化API

  1. class Context : OpenTK.IBindingsContext
  2. {//定义API绑定的上下文
  3. public IGlContext context;
  4. public IntPtr GetProcAddress(string procName)
  5. {
  6. return context.GetProcAddress(procName);
  7. }
  8. }
  9. void GLLoaded(GLView view, GLEventArgs args)
  10. {//初始化一次就行
  11. GL.LoadBindings(new Context { context = args.Context });
  12. }

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

  1. void GLRender(GLView view, GLEventArgs args)
  2. {
  3. gl.Enable(GLEnum.DepthTest);//开启深度测试
  4. gl.DepthMask(true);
  5. //其他绘制代码。。。。
  6. //开启深度测试之后要关闭,否则会无法显示界面,同样的,如果开启了其他功能,绘制结束后记得关闭,否则可能影响界面绘制。因为和界面共享OpenGL的上下文。
  7. gl.Disable(GLEnum.DepthTest);
  8. }

 

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

运行效果

 

案例源码下载:CPF_OpenGL

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

原文链接:https://www.cnblogs.com/dskin/p/17876277.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号