glGetBufferSubData pyopengl随机结果和segfau

2024-04-28 11:54:22 发布

您现在位置:Python中文网/ 问答频道 /正文

为了扩展库中的一些内容,我需要将数据从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

段故障

^{pr2}$

非法硬件指令

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

因为我想知道我的应用程序中是否有什么东西会导致这个问题(可能是坏状态,…),所以我隔离了这个问题:

"""
this code demosntrates problems with glGetBufferSubData
@author Nicolas 'keksnicoh' Heimann
"""
from gllib.glfw import * 
from OpenGL.GL import * 
import numpy as np 

# spawn glfw stuff
if not glfwInit(): raise RuntimeError('glfw.Init() error')
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
window = glfwCreateWindow(500, 500)
glfwMakeContextCurrent(window)

# push data to vbo
data = np.array([1,2,3,4,5,6], dtype=np.float32)
vbo = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, 6*4, data, GL_STATIC_READ)
glBindBuffer(GL_ARRAY_BUFFER, 0)

# pullback
recv_data = np.empty_like(data)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glGetBufferSubData(GL_ARRAY_BUFFER, 0, 6*4, recv_data)
glBindBuffer(GL_ARRAY_BUFFER, 0)

print(recv_data)

这段代码每次运行都会产生不同的结果,或者以上述错误之一结束。在

    1 keksnicoh@dhcp-172-21-66-45 ~/unih/bsc/opengl_plot_prototype (git)-[master] % python -m demos.read_vbo                                 :(
[  0.00000000e+00   1.58456325e+29   0.00000000e+00   1.58456325e+29
   4.02037986e-33   1.40129846e-45]
keksnicoh@dhcp-172-21-66-45 ~/unih/bsc/opengl_plot_prototype (git)-[master] % python -m demos.read_vbo
[  0.00000000e+00  -4.65661287e-10   0.00000000e+00  -4.65661287e-10
   5.88545355e-44   0.00000000e+00]
keksnicoh@dhcp-172-21-66-45 ~/unih/bsc/opengl_plot_prototype (git)-[master] % python -m demos.read_vbo
[  0.00000000e+00   3.68934881e+19   0.00000000e+00   3.68934881e+19
   1.89559592e+28   1.40129846e-43]
keksnicoh@dhcp-172-21-66-45 ~/unih/bsc/opengl_plot_prototype (git)-[master] % python -m demos.read_vbo
[  0.00000000e+00   2.52435490e-29   0.00000000e+00   2.52435490e-29
   1.89559592e+28   1.40129846e-43]
keksnicoh@dhcp-172-21-66-45 ~/unih/bsc/opengl_plot_prototype (git)-[master] % python -m demos.read_vbo
[  0.00000000e+00   3.68934881e+19   0.00000000e+00   3.68934881e+19
   2.92698291e-36   1.40129846e-45]
keksnicoh@dhcp-172-21-66-45 ~/unih/bsc/opengl_plot_prototype (git)-[master] % python -m demos.read_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_plot_prototype (git)-[master] % python -m demos.read_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_plot_prototype (git)-[master] % python -m demos.read_vbo
[1]    4263 segmentation fault  python -m demos.read_vbo
139 keksnicoh@dhcp-172-21-66-45 ~/unih/bsc/opengl_plot_prototype (git)-[master] % python -m demos.read_vbo                               :(
[1]    4335 segmentation fault  python -m demos.read_vbo

似乎这个glGetBufferSubData可能从错误的内存空间读取?可能是指针或U有问题?在

这是我的OpenGL设置:

[...] init GLFW
[...] load OPENGL_CORE_PROFILE 4.10
[...] initialize glfw window
  + Opengl version     410
  + GLSL Version       410
  + GLFW3              (3, 1, 2)

我使用MacBookPro Retina 2013

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

Tags: gitmasterreaddataplotdhcpopenglprototype
1条回答
网友
1楼 · 发布于 2024-04-28 11:54:22

经过对这个问题的进一步调查,我找到了解决办法。首先,我意识到recv_nudata参数可能会发生一些事情。导致一个无效的操作异常我可以看到对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),  
    )
)

可以看出,也许这个论点处理得不对,因为它不应该是一个单位8?函数glGetBufferSubData返回一个努比·恩达雷类型为unit8。然后我把这个通过。numpy视图返回到float32,最终可以读取数据。在

^{pr2}$

感谢另一个短转换的stackoverflow article

由于这种行为在我看来很奇怪,我在pyopengl票证系统上创建了一个bug ticket。在

相关问题 更多 >