C++/WinUI OpenGL 开发日志

PreLearning

相关资料

基础了解

  • WinUI是微软发布,支持原生C++和win32

  • 文档主要支持C#和C++,但是看微软的相关文档,C#和XAML比较多,XAML不知道是个啥

  • 画的界面还是很好看的

    在这里插入图片描述

  • WINUI3和MFC一样,都是界面程序开发框架,MFC不是底层,也是封装的框架,用于设计界面软甲,所以两者可以说的同级的;而不是错误的理解为,MFC为底层,WINUI3为顶层封装界面;所以后续需要做的不是将MFC链接到winUI上,而应该是移植

  • WinUI 3 与 Win32、UWP

    按微软的说法,WinUI 3 是同时为 Win32 和 UWP 程序提供支持的,也就是说它应该允许独立运行在 Win32 框架上,不受 UWP 的权限管理限制。

    对于 C++ 开发者,WinUI 3 借助 C++/WinRT 有完全的原生 C++ 支持,而不需要 C++/CX 或 C++/CLI 这样剑走偏锋的设计。这无疑对 GCC 或 Clang 上编译 WinUI 3 留下了可能。作为开发者,着实不希望微软带领技术走向分裂。

    对于 UI 设计,WinUI 3 继承了 UWP 程序的 XAML 技术,为用户提供了 Fluent 风格的控件和交互体验。也就是说在核心的 UI 开发方式上,还是和 UWP 保持一致的,只是控件风格有所改变。但是 WinUI 3 不受 UWP 复杂的权限约束限制,可以说对 Win32 开发者十分友好了。

优缺点

  • 优点

    • 好看,说是效率高

    • 应用面广,可以运用各种控件

    • 可以热重载(边修改代码边看界面)

      在vs中开始运行之后,会有xaml实时预览的界面但是看不明白是怎么用的

  • 缺点

    • 编译太慢

      主要是第一次生成解决方案比较慢,编译调试的时候还是比较快的,猜测慢的是第一次编译需要部署程序

      电脑在开发过程中需要调至开发者模式,这个模式会允许任何软件的安装,所以开发完了之后别忘了关上,不然乱七八糟的盗版软件给偷摸安装垃圾的时候就发现不了了

    • 资料少

      目前能用的就只有微软文档,但个人并不很喜欢看文档,听大佬说文档可以提高效率,不过看不太懂,博客的话比较少,Github的实例也比较少,硬着头皮看文档吧哈哈哈哈哈

    • 生成的包很大

环境搭配

  • 环境还是比较简单的,vs里面,.Net和windows桌面开发选中之后就ok,不过需要分别多选一个sdk for c++/c#,和windows10 sdk,在微软的官方文档简单配置一下即可【环境搭建】

  • WinUI Gallery 好像可以帮助快速设计好看的界面,加速开发

    有一个模板控件Template Studio for WinUI (C#)可以预定义界面,但是目前只找到c#的,没找到c++的

实例项目解读

openGL调用过程剖析

【程序来源】

主要是解析一下实例程序中openGL的调用过程,进行理解学习

    private void Game_Ready()
    {
        GL.Enable(EnableCap.DepthTest);

        _vertexBufferObject = GL.GenBuffer();
        GL.BindBuffer(BufferTarget.ArrayBuffer, _vertexBufferObject);
        GL.BufferData(BufferTarget.ArrayBuffer, _vertices.Length * sizeof(float), _vertices, BufferUsageHint.StaticDraw);

        _lightingShader = new Shader(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "OpenGL/Sample/Shaders/shader.vert"), Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "OpenGL/Sample/Shaders/lighting.frag"));
        _lampShader = new Shader(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "OpenGL/Sample/Shaders/shader.vert"), Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "OpenGL/Sample/Shaders/shader.frag"));

        {
            _vaoModel = GL.GenVertexArray();
            GL.BindVertexArray(_vaoModel);

            var positionLocation = _lightingShader.GetAttribLocation("aPos");
            GL.EnableVertexAttribArray(positionLocation);
            GL.VertexAttribPointer(positionLocation, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), 0);

            var normalLocation = _lightingShader.GetAttribLocation("aNormal");
            GL.EnableVertexAttribArray(normalLocation);
            GL.VertexAttribPointer(normalLocation, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), 3 * sizeof(float));
        }

        {
            _vaoLamp = GL.GenVertexArray();
            GL.BindVertexArray(_vaoLamp);

            var positionLocation = _lampShader.GetAttribLocation("aPos");
            GL.EnableVertexAttribArray(positionLocation);
            GL.VertexAttribPointer(positionLocation, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), 0);
        }

        _camera = new Camera(Vector3.UnitZ * 3, 0);
    }

这里的GL,找到后是在C盘中的一个反编译文件C:\TMP\MetadataAsSource\c59d170d166c47d6a81cd4aa6e87bb9f\DecompilationMetadataAsSourceFileProvider\7898be1f764142dda32ef95557fbf6e5,所以是框架自带可用的类,引用与using OpenTK.Graphics.OpenGL4;,但是这是C#中的,C++怎么办,还得重新搜索

所以有点好奇项目中的SwapChainPanel是干啥的

在注释里面说的是用于存储openGL的缓存,但是到现在还没看到具体在干啥

这个类方法是Game类的Action 调用的,Game类是继承于ContentControl的空间,里面的Action应该也是继承下来的,通过什么机制执行Action,因为Action用的是+=,和MFC的onButton不同

public Materials()
{
    InitializeComponent();

    Game.Setting = new Settings()
    {
        MajorVersion = 4,
        MinorVersion = 5,
        GraphicsProfile = ContextProfile.Compatability
    };
    Game.Ready += Game_Ready;
    Game.Render += Game_Render;
    Game.UpdateFrame += Game_UpdateFrame;
    Game.Start();
}

这个Materials的调用就是来自xaml文件了,应该是最顶层的调用了,Material()Material类的构造函数,该类继承于UserControl

    <Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*" />
                <ColumnDefinition Width="1*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="1*" />
                <RowDefinition Height="1*" />
            </Grid.RowDefinitions>
            <sample:ExampleScene Grid.Column="0"
                                 Grid.Row="0" />
            <sample:ExampleScene Grid.Column="1"
                                 Grid.Row="0" />
            <sample:ExampleScene Grid.Column="0"
                                 Grid.Row="1" />
            <sample:Materials Grid.Column="1"
                              Grid.Row="1"
                              DoubleTapped="Materials_DoubleTapped" />
        </Grid>

GridwinUI自带的控件,此处的布局

在这里插入图片描述

很明显第四处(1,1)的位置调用了openGL的机制,而显示的也是3D图形,由此看来并没用用到SwapChainPanel的相关操作,就可以实现openGL的调用,可见SwapChainPanel只是一种辅助机制,并不是根本影响

不过Grid第四条的DoubleTapped是什么没搞明白,会不会是双击的动作

是,双击后界面会全屏分屏切换,而且只有第四个有

其次就是,openGL的调用可以搜到词条,但是加上winUI后就搜不到,两种可能,能用或者不能用

C#方面既然能用,那C++方面没道理不能用,而且用法应该与其他方面相同

那现在关注的问题

  • 放在哪个控件上:Grid
  • 如何放:Sample:YourInstance
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinUI 控件、UWP 控件、WPF 控件和 Silverlight 控件在语法和结构上有所不同,因此可以通过检查 XAML 代码的命名空间来区分它们。以下是一些常见的命名空间和控件: - WinUI 控件:命名空间为 `http://schemas.microsoft.com/winui/2021/xaml/behaviors` 或 `http://schemas.microsoft.com/winui/2021/xaml/presentation`,控件名称以 `Microsoft.UI` 开头。 - UWP 控件:命名空间为 `http://schemas.microsoft.com/winfx/2006/xaml/presentation` 或 `http://schemas.microsoft.com/winfx/2008/xaml/presentation`,控件名称以 `Windows.UI` 开头。 - WPF 控件:命名空间为 `http://schemas.microsoft.com/winfx/2006/xaml/presentation` 或 `http://schemas.microsoft.com/netfx/2007/xaml/presentation`,控件名称以 `System.Windows` 或 `Microsoft.Windows` 开头。 - Silverlight 控件:命名空间为 `http://schemas.microsoft.com/winfx/2006/xaml/presentation` 或 `http://schemas.microsoft.com/client/2007`,控件名称以 `System.Windows.Controls` 或 `Microsoft.Windows.Controls` 开头。 可以通过读取 XAML 文件中的命名空间来确定使用的控件类型。例如,以下代码片段演示了如何读取 XAML 文件中的命名空间: ```csharp using System.Xml.Linq; // Load XAML file into an XDocument XDocument xdoc = XDocument.Load("MyXamlFile.xaml"); // Get the root element of the XAML file XElement root = xdoc.Root; // Get the default namespace of the XAML file XNamespace ns = root.GetDefaultNamespace(); // Check the namespace to determine the type of controls used in the XAML file if (ns.NamespaceName.StartsWith("http://schemas.microsoft.com/winui")) { // WinUI controls } else if (ns.NamespaceName.StartsWith("http://schemas.microsoft.com/winfx")) { // UWP or WPF controls } else if (ns.NamespaceName.StartsWith("http://schemas.microsoft.com/client")) { // Silverlight controls } else { // Unknown namespace } ``` 请注意,这只是一种简单的方法来区分不同类型的控件,实际上还需要考虑一些其他因素,例如控件的属性和行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值