我必须在 WPF 控件上显示立体 3D 图形。
我已经有了创建两个 DirectX-9 纹理来显示的代码,每只眼睛一个纹理。
我想使用 3D Vision(不是立体图)。
我考虑了以下方法将两张图片显示为 3D 立体:
- 使用 OpenGL 或 DirectX 11.1 Stereo API。
- 如此处所述使用 NvAPI_Stereo_SetActiveEye: http ://www.nvidia.com/docs/IO/40505/WP-05482-001_v01-final.pdf
- 使用此处描述的 NVidia 立体签名: NV_STEREO_IMAGE_SIGNATURE 和 DirectX 10/11 (nVidia 3D Vision)
- 尝试一张接一张地渲染两张图,希望 CompositionTarget.Rendering 不会丢失太多 VSync,如果丢失单个 VSync 则进行同步。此外,通过一些不可见的控件打开 3D Vision 发射器,渲染一个虚构的立体图像。
- 渲染 3D 场景并让 NVidia 驱动程序自动使其立体化。
- 渲染到一些真实的 Windows 控件(如 Winform 控件),并使用 WPF 宿主(如 WinFormHost)显示内容。
上述方法存在的问题是:
1-3:前三种方法之一似乎是直接的解决方案,但在 WPF 中是不可能的,因为我无法创建设备/上下文并控制图片的呈现方式。
4:使用 CompositionTarget.Rendering 我只能得到大约 60Hz 而不是 120Hz。我猜问题是 EndScene() 被调用了两次——一次在我的渲染场景中,另一次在 WPF 渲染机制中,但我不确定。无论如何,即使会起作用 - 该解决方案似乎不稳定。
5:由于某些技术原因,我无法渲染 3D 场景,这迫使我自己为两只眼睛渲染两个图像。
6:WinFormHost及其朋友的问题在于它不是WPF控件,并且在WPF控件方面有意外行为。例如,WinForm 控件将隐藏逻辑树上较高的 WPF 控件,它不能使用 RotateTransform 等进行旋转。
现在我选择了最后一个解决方案——使用 WinFormHost。有谁知道在真正的 WPF 控制中制作立体 3D 的牢不可破的墙的解决方案?