Unity3D glReadPixels崩溃

时间:2015-05-09 16:46:14

标签: c# unity3d

我试图在Unity3D(C#)中实现OpenGL中的 glReadPixels 功能。

public IntPtr buffer;
private const int GL_RGBA                   = 0x1908;
private const int GL_UNSIGNED_BYTE          = 0x1401;

[DllImport("/System/Library/Frameworks/OpenGL.framework/OpenGL")]
public static extern void glReadPixels (int x, int y, int width, int height, int format, int type, IntPtr buffer);

这是内存分配:

byte[] information=new byte[20*20*3];
IntPtr unmanagedPointer = Marshal.AllocHGlobal(information.Length);
Marshal.Copy(information, 0, unmanagedPointer, information.Length);

因此,在连接到相机的脚本中,我手动调用

GetComponent<Camera>().Render();

而且,在OnPostRender上:

void OnPostRender() {
    glReadPixels (0, 0, 20, 20, GL_RGBA, GL_UNSIGNED_BYTE, unmanagedPointer);
}

然而,Unity3D编辑器崩溃,没有其他线索可以确切知道发生了什么。 我不知道如果我需要做任何其他事情来使用OpenGL功能。

编辑:这是Unity的崩溃报告:

1   libsystem_c.dylib               0x00007fff91bd9b73 abort + 129
2   com.unity3d.UnityEditor5.x      0x0000000100718ae7 HandleSignal(int, __siginfo*, void*) + 1031
3   libmono.0.dylib                 0x00000001056738e2 mono_chain_signal + 71
4   libmono.0.dylib                 0x00000001055c0f37 mono_sigsegv_signal_handler + 213
5   libsystem_platform.dylib        0x00007fff91ca1f1a _sigtramp + 26
6   libGLImage.dylib                0x00007fff8e6a381f storeVecColor + 2975
7   libGLImage.dylib                0x00007fff8e6b17a2 glgProcessColor + 14610
8   libGLImage.dylib                0x00007fff8e685104 __glgProcessPixelsWithProcessor_block_invoke + 108
9   libdispatch.dylib               0x00007fff884f5344 _dispatch_client_callout2 + 8
10  libdispatch.dylib               0x00007fff884f5873 _dispatch_apply_serial + 42
11  libdispatch.dylib               0x00007fff884e9c13 _dispatch_client_callout + 8
12  libdispatch.dylib               0x00007fff884f49a1 _dispatch_sync_f_invoke + 39
13  libdispatch.dylib               0x00007fff884f4f60 dispatch_apply_f + 290
14  libGLImage.dylib                0x00007fff8e684ece glgProcessPixelsWithProcessor + 6869
15  com.apple.GeForceTeslaGLDriver  0x0000123440311ea0 0x123440000000 + 3219104
16  GLEngine                        0x00007fff923acbf8 glReadPixels_Exec + 1390
17  libGL.dylib                     0x00007fff91770bd5 glReadPixels + 57

更新:最后,我设法解决了这次崩溃。 unmanagedPointer未正确分配。但是,内存分配仍存在一些问题。如果我在Update()上渲染相机(在OnPostRender上调用glReadPixels),Unity会在3-4秒后崩溃。

正如您在此崩溃报告中所看到的那样:

6   libGPUSupport.dylib             0x00000001188a627d 
gpulCheckForFramebufferIOSurfaceChanges + 54
7   libGPUSupport.dylib             0x00000001188a6202 gldUpdateReadFramebuffer + 42
8   GLEngine                        0x00007fff9247e01c gleUpdateReadFramebufferState + 425
9   GLEngine                        0x00007fff923ac751 glReadPixels_Exec + 

它似乎与 gpulCheckForFramebuffer 有关。 任何的想法?

1 个答案:

答案 0 :(得分:2)

您没有为结果分配足够的内存。您为20x20图像分配每像素3个字节:

byte[] information=new byte[20*20*3];

但是对于glReadPixels()来电,您指定的是GL_RGBA格式:

glReadPixels (0, 0, 20, 20, GL_RGBA, GL_UNSIGNED_BYTE, information);

使用GL_RGBA格式读取时,每个像素4个字节将写入提供的目标(R,G,B和A各一个字节)。

您需要为每个像素分配4个字节:

byte[] information = new byte[20 * 20 * 4];

或将格式更改为GL_RGB,结果中每个像素只需要3个字节:

glReadPixels(0, 0, 20, 20, GL_RGB, GL_UNSIGNED_BYTE, information);