Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用OpenGL+;。NET并在视口上绘制_C++_.net_Winforms_Opengl - Fatal编程技术网

C++ 在C+中使用OpenGL+;。NET并在视口上绘制

C++ 在C+中使用OpenGL+;。NET并在视口上绘制,c++,.net,winforms,opengl,C++,.net,Winforms,Opengl,我正在尝试创建一个使用OpenGL的.NET应用程序。我需要4个视口,但不是创建4个控件并同步它们,而是将1个控件拆分为4个视口。我想在OpenGL控件上绘制线条,以直观地分割视口。我正在使用一个自定义控件,为了实现这一点,我在基本UserControl的顶部有两个面板。中间的面板是OpenGL面板,其中OpenGL输出被渲染。顶部的面板是我要绘制视口分隔符的地方,它具有透明度,因此我可以看到它下面的面板 问题是,当OpenGL视口加载时(它在一个单独的线程中,所以它只是黑色的几秒钟),它会覆盖

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

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


为什么会这样?如果您想了解我是如何创建OpenGL上下文之类的。我传递的是面板的句柄,而不是用户控件的句柄。custrom控件中的所有控件是否共享相同的设备上下文或其他内容?

OpenGL不使用.net windows窗体在屏幕上绘制,它直接与图形硬件交互。实现所需的一种方法可能是将opengl输出渲染到屏幕外纹理/帧缓冲区(fbo),然后以某种方式在正常的.net UI中访问帧缓冲区。我建议您只需使用OpenGL调用绘制视口分隔符,而完全不使用.net UI元素。

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

好吧,使用GDI+绘制要比使用OpenGL容易得多。GDI+还与我的应用程序的其余部分兼容,而OpenGLs资源则不兼容。这肯定是唯一的办法吗?我创建的分割线是可移动的,因此我可以调整视口的大小。我想,这在OpenGL中要困难得多,因为没有内置的“MouseDown”事件。OpenGL根本不处理事件。它只是画东西。您始终可以创建独立的OpenGL窗口,并将它们放在常规拆分器之间。然后,您可以为所有窗口使用一个公共上下文,或者在每个窗口的各个上下文之间共享资源。@datenwold我不相信我提到了OpenGL使用事件。我声明他们没有使用事件(您可以创建自己的事件,因此使用内置语句),这就是我不愿意更改的原因。然而,我似乎找不到在GDI+中绘制除法器的方法,所以你的答案是正确的。好吧,如果为了使用.NET绘制而必须做所有这些,那么我想使用OpenGL会更容易。。。我会调查的。