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

Posted

技术标签:

【中文标题】在 C++.NET 中使用 OpenGL 并在视口上绘画【英文标题】:Using OpenGL in C++.NET and Painting Over the Viewport 【发布时间】:2012-08-14 23:38:22 【问题描述】:

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

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

为什么会这样?如果你想看看我是如何创建 OpenGL 上下文等的,you can see the tutorial I followed。我正在传递面板的句柄,而不是用户控件的句柄。 cusstrom 控件中的所有控件是否共享相同的设备上下文或其他内容?

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗯,使用 GDI+ 绘图比使用 OpenGL 容易得多。 GDI+ 也与我的应用程序的其余部分兼容,而 OpenGL 资源则不兼容。这肯定是唯一的方法吗?我创建的分隔线是可移动的,因此我可以调整视口的大小。我想,这在 OpenGL 中要困难得多,因为没有内置的“MouseDown”事件。 OpenGL 根本不处理事件。它只是画东西。您始终可以制作独立的 OpenGL 窗口并将它们放在常规拆分器之间。然后,您可以为所有窗口使用一个公共上下文,或者在每个窗口的各个上下文之间共享资源。 @datenwold 我不相信我提到了使用事件的 OpenGL。我说他们不使用事件(你可以创建自己的,因此是内置语句),这就是我不愿意改变的原因。但是,我似乎找不到在 GDI+ 中绘制分隔线的方法,所以你的答案是正确的。【参考方案2】:

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

【讨论】:

好吧,如果我必须做所有这些只是为了使用 .NETs 绘图,那么我想使用 OpenGL 会更容易......我会研究一下。

以上是关于在 C++.NET 中使用 OpenGL 并在视口上绘画的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL场景 - Iphone

视口内的 OpenGL 视口

在opengl的视口角落绘制世界坐标系

OpenGL编程 基础篇世界窗口和视口

OpenGL-坐标系

opengl:设置视口和 glortho 时遇到问题