PreLearning
相关资料
-
不出意外的话应该是可以使用的,在c#上能用,没道理c++不能用,不过可能自己找一下教程,目前是没找到,c#已经有现成的3D视图显示的示例程序
基础了解
-
WinUI是微软发布,支持原生C++和win32
-
文档主要支持C#和C++,但是看微软的相关文档,C#和XAML比较多,XAML不知道是个啥
-
画的界面还是很好看的
-
WINUI3和MFC一样,都是界面程序开发框架,MFC不是底层,也是封装的框架,用于设计界面软甲,所以两者可以说的同级的;而不是错误的理解为,MFC为底层,WINUI3为顶层封装界面;所以后续需要做的不是将MFC链接到winUI上,而应该是
移植
-
按微软的说法,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>
Grid
是winUI
自带的控件,此处的布局
很明显第四处(1,1)的位置调用了openGL
的机制,而显示的也是3D图形,由此看来并没用用到SwapChainPanel
的相关操作,就可以实现openGL
的调用,可见SwapChainPanel
只是一种辅助机制,并不是根本影响
不过Grid第四条的DoubleTapped
是什么没搞明白,会不会是双击的动作
是,双击后界面会全屏分屏切换,而且只有第四个有
其次就是,openGL的调用可以搜到词条,但是加上winUI后就搜不到,两种可能,能用或者不能用
C#方面既然能用,那C++方面没道理不能用,而且用法应该与其他方面相同
那现在关注的问题
- 放在哪个控件上:
Grid
- 如何放:
Sample:YourInstance