1

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

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

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

4

2 回答 2

2

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

于 2012-08-15T00:06:38.557 回答
1

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

于 2012-08-14T23:48:29.100 回答