在 C++.NET 中使用 OpenGL 并在视口上绘画

Using OpenGL in C++.NET and Painting Over the Viewport

本文关键字:视口 绘画 OpenGL C++ NET      更新时间:2023-10-16

我正在尝试创建一个使用OpenGL的.NET应用程序。我需要有 4 个视口,但我将有 1 个拆分为 4 个视口的控件,而不是创建 4 个控件并同步它们。我想在 OpenGL 控件上绘制线条以直观地拆分视口。我正在使用自定义控件,为此,我在基本 UserControl 的顶部有两个面板。中间的面板是 OpenGL 面板,其中渲染了 OpenGL 输出。顶部的面板是我要绘制视口分隔线的地方,它具有透明度,因此我可以看到它下面的面板。

问题是,当 OpenGL 视口加载时(它在单独的线程中,所以它只是黑色几秒钟),它会覆盖整个 UserControl,而不管它的 z 层如何。如果我缩小 OpenGL 面板,我可以看到它仍然只在面板上绘制,但它只是不关心它上面的内容——它只是掩盖了它。

为什么会这样?如果你想看看我是如何创建OpenGL上下文的,你可以看看我遵循的教程。我传递的是面板的句柄,而不是用户控件的句柄。custrom 控件中的所有控件是否共享相同的设备上下文或其他内容?

使用启用GL_SCISSOR_TEST的 glViewportglScissor 的组合将窗口拆分为视口。使用 OpenGL 本身绘制视口拆分器。您可以随时更改使用的投影。因此,对于拆分器,使视口覆盖整个窗口,绘制拆分器,然后将视口限制在窗格上,并使用剪刀防止东西"泄漏"到它外面。

OpenGL不使用.net Windows表单在屏幕上绘制,它直接与图形硬件交互。实现所需目标的一种方法可能是将 opengl 输出呈现为屏幕外纹理/帧缓冲区 (fbo),然后以某种方式访问普通 .net UI 中的帧缓冲区。相反,我建议您简单地使用 OpenGL 调用绘制视口分隔线,并完全绕过使用 .net UI 元素。