Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Opengl Mesa3D不';我不喜欢我的上下文创建代码?_Opengl_Winforms Interop_Mesa - Fatal编程技术网

Opengl Mesa3D不';我不喜欢我的上下文创建代码?

Opengl Mesa3D不';我不喜欢我的上下文创建代码?,opengl,winforms-interop,mesa,Opengl,Winforms Interop,Mesa,今天我不再依赖OpenTK;我的应用程序不再依赖OpenTK来创建OpenGL上下文。但是,在Mesa 3D(OpenGL的软件渲染实现)中运行时,我的代码不再能够正常工作;我的代码运行时,FPS大约为0.001 FPS(相比之下,使用OpenTK的上下文创建时,FPS大约为16+FPS),通常绘制到FBO的内容会显示在窗口上,一块一块地显示。虽然在没有Mesa 3D的情况下运行我的代码可以获得正常的性能(在Windows 7上),但我担心这可能只是巧合,因为它工作得很好glGetErrorch

今天我不再依赖OpenTK;我的应用程序不再依赖OpenTK来创建OpenGL上下文。但是,在Mesa 3D(OpenGL的软件渲染实现)中运行时,我的代码不再能够正常工作;我的代码运行时,FPS大约为0.001 FPS(相比之下,使用OpenTK的上下文创建时,FPS大约为16+FPS),通常绘制到FBO的内容会显示在窗口上,一块一块地显示。虽然在没有Mesa 3D的情况下运行我的代码可以获得正常的性能(在Windows 7上),但我担心这可能只是巧合,因为它工作得很好
glGetError
checks没有显示任何错误,这让我觉得可能是我在创建上下文时做错了什么

m_controlHandle=m_winForm.Handle;/*HWND*/
m_controlDC=Win32.GetDC(m_controlHandle);/*HWND的DC*/
Win32.PixelFormatDescriptor pixelFormat=新的Win32.PixelFormatDescriptor();
pixelFormat.Size=(短)Marshal.SizeOf(typeof(Win32.PixelFormatDescriptor));
pixelFormat.Version=1;
像素格式。标志=
Win32.PixelFormatDescriptorFlags.DRAW\u TO\u窗口|
Win32.PixelFormatDescriptorFlags.SUPPORT\u OPENGL|
Win32.PixelFormatDescriptorFlags.DOUBLEBUFFER;
pixelFormat.PixelType=Win32.PixelType.RGBA;
pixelFormat.ColorBits=32;
pixelFormat.DepthBits=0;/*是的,我不使用深度缓冲区;2D精灵游戏*/
pixelFormat.LayerType=Win32.PixelFormatLayerType.MAIN\u平面;
int formatCode=Win32.ChoosePixelFormat(m_controlDC,ref pixelFormat);
if(formatCode==0)
抛出新的Win32Exception(Marshal.GetLastWin32Error());
if(!Win32.SetPixelFormat(m_controlDC,formatCode,ref pixelFormat))
抛出新的Win32Exception(Marshal.GetLastWin32Error());
m_openGLContext=Win32.wglCreateContext(m_controlDC);
if(m_openGLContext==IntPtr.Zero)
抛出新的Win32Exception(Marshal.GetLastWin32Error());
if(!Win32.wglMakeCurrent(m_controlDC,m_openGLContext))
抛出新异常(“无法wglMakeCurrent.”);

这是正确的吗?关于追踪可能导致Mesa3D突然发疯的原因有什么建议吗?

如果要避免软件实现,选择像素格式的逻辑中存在一个主要缺陷。回想一下(或第一次学习)WGL使用了一种模式匹配启发式方法,该方法寻找一组最小程度满足您所请求参数的所有像素格式。您将请求的参数设置为0的次数越多,在解决“最佳”(最接近)匹配时产生的歧义就越多

如果您想了解为什么0位深度缓冲区与32位颜色缓冲区相结合可能是个坏主意,您可以列举显示驱动程序提供的所有像素格式,并检查哪些格式是完全硬件加速的(它们不会有标志:
PFD\u GENERIC\u FORMAT
PFD\u GENERIC\u accelerated
set)。有一个软件可以帮你做到这一点,尽管我想不出有什么现成的——如果你真的决定这么做,请准备好浏览数百种像素格式的列表

许多奇怪的参数组合是在软件(GDI)中实现的,而不是硬件。为了获得硬件格式,最好尝试的位深度之一是32位RGBA、24位深度、8位模具。在现代硬件上,对于输入参数的最合理组合,这几乎总是驱动程序选择的“最接近”匹配。越接近于选择一种精确的硬件像素格式,就越有可能阻止Win32/WGL为您提供GDI像素格式


根据我自己的观察: 我不得不手动枚举像素格式,并覆盖
ChoosePixelFormat(…)
的行为,以解决很久以前的驱动程序错误;模式匹配行为并不总是对您有利

在OpenTK的例子中,我怀疑它实际上使用了
wglChoosePixelFormatARB(…)
,这是一个用于选择像素格式的更加复杂的接口(并且是支持多采样消除混叠所必需的)
wglChoosePixelFormatARB
由可安装的客户端驱动程序(ICD)实现,因此它从不尝试将输入参数与GDI像素格式匹配

我怀疑GDI提供了32位RGBA+0位Z像素格式,但您的ICD没有。由于最接近的匹配总是获胜,并且
ChoosePixelFormat
可以看到GDI像素格式,因此您可以了解这是一个问题的原因

您应该尝试32位RGBA(24位颜色,8位Alpha)+24位Z+8位模具,看看这是否能提高您的性能


更新: 还有一个问题可能会绊倒一些愚蠢的司机
ColorBits
应该是RGBA像素格式中的RGB位数(通常为24)
字母位
应该是位的数量(通常为8)。许多驱动程序将看到32位
彩色位
与0位
字母位
组合,并理解隐含行为(24位RGB+8位填充),但编写代码的方式可能会很麻烦。从技术上讲,这种像素格式称为
RGBX8
(其中X表示未使用的位)


24
ColorBits
和8
AlphaBits
可能提供更便携的结果。

好的。。。我希望没有人需要经历我试图弄明白这一点所做的一切,所以这里有一个解决方案:

尽管OpenTK将尝试使用
wglChoosePixelFormatARB
,但在Mesa 3D上失败,并返回到
ChoosePixelFormat
。但是,OpenTK调用的函数实际上是
ChoosePixelFormat
DllImports
wglChoosePixelFormat
而不是
ChoosePixelFormat

是的,有两个版本的
ChoosePixelFormat
:一个前缀为
wgl
,另一个没有前缀。发件人:

在Win32平台上,有许多特定于平台的函数调用