1

我正在使用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 错误是由于我试图将对象强制转换为指针,我很傻。

4

2 回答 2

2

EGLNativeWindowType 在 ANGLE 中定义如下:

#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) /* Windows Desktop */
typedef HWND    EGLNativeWindowType;
#else /* Windows Store */
#include <inspectable.h>
typedef IInspectable* EGLNativeWindowType;
#endif

因此,当在通用 Windows 应用程序中使用 C++/WinRT 类型时,我必须注意不要将这些类型与其他代码使用的 C++/CX 类型混合。

我试图将 PropertySet 指针(该函数的实现在使用 UWP 时所期望的)转换为 winrt::Windows::Foundation::IInspectable 指针。这不是 ANGLE 实现所期望的 C++/CX IInspectable 类型。所以我不得不直接转换为 EGLNativeWindowType:

PropertySet surfaceProperties;
surfaceProperties.Insert(EGLNativeWindowTypeProperty, window);
EGLNativeWindowType win = reinterpret_cast<EGLNativeWindowType>(&surfaceProperties);

mEGLSurface = eglCreateWindowSurface(mEGLDisplay, config, win, surfaceAttributes);

这是尝试在 UWP 环境中使用标准 C++ 时的警告之一。请参阅有关使用 C++/CX 代码共享 C++/WinRT 的答案:

https://stackoverflow.com/a/39775875/1891866

于 2017-10-04T15:40:18.587 回答
0

winrt'PropertySet与 cx' 不兼容也存在问题PropertySet

这对我有用:

PropertySet surfaceCreationProperties;
surfaceCreationProperties.Insert(EGLNativeWindowTypeProperty, panel);
EGLNativeWindowType win = static_cast<EGLNativeWindowType>(winrt::get_abi(surfaceCreationProperties));
surface = eglCreateWindowSurface(mEglDisplay, mEglConfig, win, surfaceAttributes);
于 2019-07-12T03:02:39.817 回答