我正在使用ANGLE 项目的 Microsoft 分支来访问通用 Windows 应用程序中的 OpenGL。此外,我尽可能多地使用C++/WinRT 绑定来编写标准 C++ 代码。
我从 ANGLE 项目中的一个示例开始,并尝试将 C++/CX 代码转换为 C++/WinRT 代码,但我找不到创建 EGL Surface 部分的解决方案:
mEGLSurface = eglCreateWindowSurface(mEGLDisplay, config, /*WHERE IS MY HWND?*/, NULL);
在 C++/CX 中,他们使用以下代码,但我必须承认,我不知道他们如何从带有 CoreWindow 的 PropertySet 到 EGLNativeWindowType(在本例中为 HWND)以及如何将其转换为 C++/WinRT 代码:
PropertySet^ surfaceCreationProperties = ref new PropertySet();
surfaceCreationProperties->Insert(ref new String(EGLNativeWindowTypeProperty), window);
mEglSurface = eglCreateWindowSurface(mEglDisplay, config, reinterpret_cast<IInspectable*>(surfaceCreationProperties), surfaceAttributes);
编辑:当天真地将代码转换为 C++/WinRT 约定时,reinterpret_cast 会给出“无效转换”错误(从 IInspectable 到 EGLNativeWindowType)。
编辑:为了完整起见,window
参数是 Windows::UI::Core::CoreWindow。
编辑:实际上这个类似问题的答案提供了很多很好的信息,我会进一步调查。
编辑:在阅读了上一个编辑中链接的答案并查看了 ANGLE 源代码中的正确位置后,我发现我的困惑是由 ANGLE 的 Windows 端特定的实现细节引起的。该函数不期望传统意义上的 HWND 句柄,而更像是伪装成 HWND 的设置字典。此外,reinterpret_cast 错误是由于我试图将对象强制转换为指针,我很傻。