Habrokast“手动日落”#1。 尝试建立用于开发Windows玩具的环境

只是想出了一个想法-您需要找到某种爱好。 否则,您可以移开线圈。 而且由于我是一个非常无用的人,除了拨动按钮外别无他法,因此业余爱好将是这样的:每周至少一次安排一次流水,同时写一个玩具。 流之后,该记录在Habré上发布。 (您可以尝试在Habr上实时发布,但这要困难得多)。


写作受反馈的驱动很大-如果有人需要解释,那么我可以解释如何做到。 如果有建议-我会尽量考虑。 在habr上,所有注释都被读到最后,在其他地方-如何运行。


这里的第一个煎饼是块状的:



在过场动画下面是一篇论文的描述,适合那些刚被花一个半小时观看的人。


指导思想


第一个有趣的方面是,您希望编写所有内容时都不要修饰。 普通的拳师怎么办? 有一个问题-您可以根据它找出一个阴郁的地方,它可以为您解决问题。 这样做的代价是,由于有这样的猪,该项目变成了猪圈,没有人能确切确定正在发生的事情。 我想尝试在没有这个养猪场的情况下,保持整洁。 也许这是不可能的-请在评论中告知我们。


第二方面。 我一生都在编写Java和PHP。 有开发玩具的经验,但只有在服务器部分才可以通过网络得到答案,而没有一次-是C ++的真正桌面应用程序。 因此,从本质上讲,这将是一个怪胎表演-一个不了解问题的人将尝试以某种方式用自己的话描述正在发生的事情。


不,所有这些都没有实际价值。 这是为了避免掉落线圈,并激励成年大胡子的叔叔也抓住键盘并给玩具打气。


常规打a


不幸的是,编程永远不会从轻松愉快的娱乐开始。 最初,需要一段时间来深入研究环境和IDE设置。


我对Visual Studio了解的第一件事对专业人士来说是一个很棒的工具,但是它给初学者留下了非常沮丧的印象。 在Eclipse和IntelliJ IDEA之后,您知道所有事情都是某种不自然的,淡紫色的无用的小东西,需要重新订阅。 根本不是关于VS,而是关于我:-)


使用插件总是会遇到麻烦。




因此,通过一个故意的决定,我们放弃了Vizhualka,看看还有什么。 Vim,Emacs和其他不了解源代码结构的编辑器由林发送。 首次使用Eclipse的尝试失败,因此选择了该工具CLion


CLion的问题在于它仍然不能完全与Visual Studio编译器一起使用。 如果您尝试在其中执行某些操作,它将看起来像这样:




当然,会有一个线程跑到goshniks中,并开始发出尖锐的尖叫声,说每个人都有足够的调试打印信息。 但是,我们当然不会听他们的。


因此,您需要CLion可以做得很好的东西,这就是MinGW。


选择MinGW


有一个大版本表




它表明仅查看Cygwin和Msys2是有意义的。 Msys2有点奇怪-它的提交者很少,这些软件包位于其中一位作者的个人github上 。 另一方面,它真的很酷-有一个新鲜的编译器和一堆软件包。 这很关键。


安装过程包括调用next-next-ok,然后重复执行更新命令(如Archlinux中的pacman -Syu ),然后重新启动Msys2终端,直到它说一切都以最佳方式进行。


如果仅按照说明安装Msys2,然后尝试将其添加到CLion,将找不到工具链。 您需要自己安装它,这是通过pacman -S mingw-w64-x86_64-toolchain命令完成的。


安装此软件包后,CLion将启动helloworld(在创建新项目时会自动生成)并在其中进行调试。


功能检查1:简单的窗口


首先,我想了解是否至少有一些桌面应用程序会启动。 不过,这不是本机PlatformSDK,而是MinGW。


为此,适合使用使用vinapi绘制窗口的简单程序


是的,有了MinGW,它开始了。 但是使用Visual Studio工具链,它会注入一些错误,但是我没有处理它们,因为-但是,如果目标平台已经对我们有用,为什么呢?


功能检查2:带有着色器的三角形


显然,要写出可行的东西还不足以在窗口上显示像素。 刹车,不舒服,没有花哨的东西。 简而言之,我们需要DirectX。


有关CLion + MinGW的关键问题是这个。 如果他们不能使用DirectX,则将它们发送到回收站。


为了进行测试,谷歌搜索了一个非常简短的教程 ,该教程仅包含两个文件:一个包含所有C ++代码,另一个包含着色器。 挑战在于使其发挥作用。


除了单文件性质外,本教程非常好,因为它可以告诉您如何工作。 也许应该将本文转移到Habr(在注释中写)。


最终结果在GitHub上 。 在这里,我将描述遇到的问题。


小东西和垃圾


许多L线已变成字符串。 您可以删除字母L。在许多地方,需要将NULL替换为0,以使其不会下降。


尽管使用了set(CMAKE_CXX_STANDARD 17) ,但在这方面没有发生任何有趣的事情,也没有发生任何崩溃。


标题和库


当然,事实是该示例非常古老,写于Windows 10之前的几天。DirectX不再像我们有争议的青年时代那样位于单独的DirectX SDK中,而是直接塞入Windows SDK中。


因此,首先要做的是运行Visual Studio安装程序并验证是否安装了Windows SDK的最新版本。


第二个问题在头条。


 #include <d3d11.h> #include <d3dx11.h> #include <d3dx10.h> 

他们不再是,您需要类似:


 #include <d3d9.h> #include <d3d10.h> #include <d3d11.h> #include <dxgi.h> 

然后在CMakeLists中在文件末尾添加一个搜索:


 set(LIBS d3d9 d3d11 d3dcompiler_43) target_link_libraries(src ${LIBS}) 

缺少API


以前有这样一种结构


 typedef struct D3DXCOLOR { FLOAT r; FLOAT g; FLOAT b; FLOAT a; } D3DXCOLOR, *LPD3DXCOLOR; 

她不再了。 但是,在所有真正需要它的地方,事实证明都是用{0.0f, 0.2f, 0.4f, 1.0f}替换D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f)


事实证明,使用D3DX11CompileFromFile这个问题更加有趣。 她不再了!


在“ 没有D3DX的生活 ”一文中建议将其替换为D3DCompileFromFile




但这就是问题,由于某些原因, D3DCompileFromFile也无法使用!


一项小型调查显示,Microsoft文档建议使用非常新版本的API:




MinGW使我们回到过去的几年:




但是,在32位版本中有一个较新的标头,但我不明白如何将其添加到64位。 在图1和图2中,大概32位没有放弃。


一方面,这很可悲,因为它预示着将来与MinGW的关系会出血。 我不知道谁是所有这些事情的礼节。


另一方面,如果我们使用缺少的D3DCompile和当前的D3DCompileFromFile


 HRESULT WINAPI D3DCompileFromFile( in LPCWSTR pFileName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

 HRESULT WINAPI D3DCompile( in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in_opt LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

事实证明,只有以下几点不同:


  in LPCWSTR pFileName, 

反对


  in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, 

不幸的是,我不了解C ++,所以我告诉了我我该怎么做:我刚刚添加了文件减法,并将此数据重定向到D3DCompile


 void WINAPI D3DCompileFromFile(const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages) { SIZE_T data_size; char* buffer; ifstream infile; infile.open(filename, ios::binary); infile.seekg(0, ios::end); data_size = infile.tellg(); infile.seekg(0, ios::beg); buffer = new char[data_size]; infile.read(buffer, data_size); infile.close(); D3DCompile(buffer, data_size,filename, defines, include,entrypoint, target, sflags, eflags, shader, error_messages); } 

D3DX11CompileFromFile和我们自制的D3DCompileFromFile之间的唯一重要区别是,缺少ID3DX11ThreadPump作为新API中的参数。 这是异步的东西,也许是某种线程池吗? 但是,本教程未使用过他,他的位置为0。


总结


一堆DirectX + MinGW + Msys2 + CLion足以切入一个简单的游戏。 不仅有机会使用基本的vinapi,而且有机会进行绘制,甚至使用着色器。


一般来说,仅此而已。 我提醒您,简单的结果就在GitHub上


请记住,这不是我的代码,而是教程中的修改文本-但是,我希望它的使用是诚实且有针对性的。 但是,这就是为什么那里没有普通许可证的原因。




意见反馈


请在评论中写下您的评论和建议。 为此,一切都做好了,听您说。 尤其是如果您是一位经验丰富的游戏程序员,那么只是野牛,野牛而已,您就无法适应各种规模。 确保进来并写点东西。


我提醒您,我和其他任何博主一样,都喜欢吃东西和设计。 您越激烈地在此帖子下播放向上箭头,下一个帖子和信息流出现的可能性就越大。


                  

©亚历山大·雷夫斯基

Source: https://habr.com/ru/post/zh-CN424971/


All Articles