Python glGetBufferSubData pyopengl随机结果和segfault

Python glGetBufferSubData pyopengl随机结果和segfault,python,opengl,pyopengl,Python,Opengl,Pyopengl,要扩展库中的某些内容,我需要将数据从VBO读回CPU内存。这里不涉及转换反馈 当我从缓冲区读取数据时,我要么得到“随机数据”,要么得到“分段错误”,要么得到“非法硬件指令”,要么得到“malloc” 以下是我得到的不同错误: malloc python(678,0x7fff746f7000) malloc: *** error for object 0x7fa532e1d6b8: incorrect checksum for freed object - object was probably

要扩展库中的某些内容,我需要将数据从VBO读回CPU内存。这里不涉及转换反馈

当我从缓冲区读取数据时,我要么得到“随机数据”,要么得到“分段错误”,要么得到“非法硬件指令”,要么得到“malloc”

以下是我得到的不同错误:

malloc

python(678,0x7fff746f7000) malloc: *** error for object 0x7fa532e1d6b8: 
incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
[1]    678 abort      python -m glib.examples.transformation_domain
segfault

[1]    2448 segmentation fault  python -m demos.read_vbo
非法硬件指令

objc[2789]: Method cache corrupted. This may be a message to an invalid object, or a memory error somewhere else.
objc[2789]: receiver 0x7fcaee1efaf0, SEL 0x7fff8314a468, isa 0x7fff72e0cf18, cache 0x7fff72e0cf28, buckets 0x7fcaee1d0a10, mask 0x1f, occupied 0x10
objc[2789]: receiver 64 bytes, buckets 528 bytes
objc[2789]: selector 'key'
objc[2789]: isa '_CFXNotificationNameWildcardObjectRegistration'
objc[2789]: Method cache corrupted.
[1]    2789 illegal hardware instruction  python -m glib.examples.transformation_domain
由于我想知道我的应用程序中是否有可能导致此问题的东西(可能是坏状态,…),我隔离了此问题:

“”“
此代码演示glGetBufferSubData的问题
@作家尼古拉斯·凯克斯尼科·海曼
"""
从gllib.glfw导入*
从OpenGL.GL导入*
将numpy作为np导入
#产卵glfw的东西
如果不是glfwInit():引发运行时错误('glfw.Init()错误')
glfwWindowHint(GLFW_上下文_版本_专业,4);
glfwWindowHint(GLFW_上下文_版本_小调,1);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
窗口=glfwCreateWindow(500500)
glfwMakeContextCurrent(窗口)
#将数据推送到vbo
data=np.array([1,2,3,4,5,6],dtype=np.float32)
vbo=glGenBuffers(1)
glBindBuffer(GL_数组_缓冲区,vbo)
glBufferData(GLU数组缓冲区,6*4,数据,GLU静态读取)
glBindBuffer(GL_数组_缓冲区,0)
#后退
recv_data=np.empty_like(数据)
glBindBuffer(GL_数组_缓冲区,vbo)
glGetBufferSubData(GL_数组_缓冲区,0,6*4,recv_数据)
glBindBuffer(GL_数组_缓冲区,0)
打印(记录数据)
此代码在每次运行或以上述错误之一结束时产生不同的结果

1keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo:(
[0.00000000 E+00 1.58456325e+29 0.00000000 E+00 1.58456325e+29
4.02037986e-33 1.40129846e-45]
keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo
[0.00000000e+00-4.65661287e-10 0.00000000e+00-4.65661287e-10
5.88545355e-44 0.00000000 E+00]
keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo
[0.00000000 E+00 3.68934881e+19 0.00000000 E+00 3.68934881e+19
1.89559592e+28 1.40129846e-43]
keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo
[0.00000000e+00252435490E-290.00000000e+00252435490E-29
1.89559592e+28 1.40129846e-43]
keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo
[0.00000000 E+00 3.68934881e+19 0.00000000 E+00 3.68934881e+19
2.92698291e-36 1.40129846e-45]
keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo
[0.00000000e+00-3.68934881e+19 0.00000000e+00-3.68934881e+19
7.42639198e-31 1.40129846e-45]
keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo
[0.00000000e+00-4.65661287e-10 0.00000000e+00-4.65661287e-10
7.22223950e-33 1.40129846e-45]
keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo
[1] 4263分割错误python-m demos.read_vbo
139keksnicoh@dhcp-172-21-66-45~/unih/bsc/opengl\u plot\u prototype(git)-[master]%python-m demos.read\u vbo:(
[1] 4335分割错误python-m demos.read_vbo
这个glGetBufferSubData可能从错误的内存空间读取?或者指针recv_数据可能有一些问题

这是我的OpenGL设置:

[...] init GLFW
[...] load OPENGL_CORE_PROFILE 4.10
[...] initialize glfw window
  + Opengl version     410
  + GLSL Version       410
  + GLFW3              (3, 1, 2)
我使用MacBookPro视网膜2013

Date/Time:             2015-06-22 21:30:53.795 +0200
OS Version:            Mac OS X 10.10.2 (14C109)
Report Version:        11

在对这个问题进行了更多的调查之后,我找到了一个解决方案。首先,我意识到recv_data参数可能发生了一些事情。导致了一个无效的操作异常,我可以看到clGetBufferSubData的c调用的内部跟踪

    OpenGL.error.GLError: GLError(
    err = 1281,
    description = 'invalid value',
    baseOperation = glGetBufferSubData,
    pyArgs = (
        GL_ARRAY_BUFFER,
        0,
        48,
        array([ 0.,  0.,  0.,  0.,  0.,  0.], dtype=float32),
    ),
    cArgs = (
        GL_ARRAY_BUFFER,
        0,
        48,
        array([0, 0, 0, 0, 0, 0], dtype=uint8),  *** < data is now unit8 instead of float32
    ),
    cArguments = (
        GL_ARRAY_BUFFER,
        0,
        48,
        array([0, 0, 0, 0, 0, 0], dtype=uint8),  
    )
)
OpenGL.error.GLError:GLError(
err=1281,
description='无效值',
baseOperation=glGetBufferSubData,
pyArgs=(
GL_数组_缓冲区,
0,
48,
数组([0,0,0,0,0,0,0,0.],dtype=float32),
),
汽车=(
GL_数组_缓冲区,
0,
48,
数组([0,0,0,0,0,0,0],dtype=uint8),***<数据现在是unit8而不是float32
),
cArguments=(
GL_数组_缓冲区,
0,
48,
数组([0,0,0,0,0,0,0],dtype=uint8),
)
)
可以看出,可能参数处理错误,因为它不应该是unit8?函数glGetBufferSubData返回unit8类型的numpy.ndarray。然后我通过.numpy视图将其转换回float32,并最终读取数据

# pullback
glBindBuffer(GL_ARRAY_BUFFER, vbo)
raw_unit8_data = glGetBufferSubData(GL_ARRAY_BUFFER, 0, 6*4)
glBindBuffer(GL_ARRAY_BUFFER, 0)
print(raw_unit8_data.view('<f4'))
#回调
glBindBuffer(GL_数组_缓冲区,vbo)
原始单元8\u数据=glGetBufferSubData(GL\u数组\u缓冲区,0,6*4)
glBindBuffer(GL_数组_缓冲区,0)

print(raw_unit8_data.view('尝试检查OpenGL错误。我最初认为glGetBufferSubData可能不会暂停管道,但根据其他答案,它确实会暂停。以防万一,您可以尝试放置一个glFinish()在写调用和读调用之间确定。您也可以初始化为0,而不是像空数组一样,并将recv_数据的分配移动到第一个glBufferData之上,这样您就可以确定您没有从OpenGL获得虚假数据。我曾尝试将recv_数据初始化为空数组,但后来我发现segfaults更频繁。