gpt4 book ai didi

c++ - 如何使用 C++/WinRT 和 ANGLE 创建 EGLSurface?

转载 作者:行者123 更新时间:2023-11-30 03:28:31 24 4
gpt4 key购买 nike

我正在使用 Microsoft branch of the ANGLE project在通用 Windows 应用程序中访问 OpenGL。我也使用 C++/WinRT binding尽可能多地使用标准 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。

编辑:实际上 this对类似问题的回答提供了很多有用的信息,我将进一步调查。

编辑:阅读之前编辑中链接的答案并查看 ANGLE 源代码中的正确位置后,我发现我的困惑是由特定于 Windows 端的 ANGLE 的实现细节引起的。该函数并不需要传统意义上的 HWND 句柄,而更像是伪装成 HWND 的设置字典。另外,reinterpret_cast 错误是由于我试图将一个对象转换为一个指针,愚蠢的我..

最佳答案

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

关于c++ - 如何使用 C++/WinRT 和 ANGLE 创建 EGLSurface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46550182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com