我试图在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 有关。 任何的想法?
答案 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);