使用 OpenGL Crystal 绑定时获取 "Invalid memory access (signal 11)" (glGenBuffers)
Getting "Invalid memory access (signal 11)" when using OpenGL Crystal bindings (glGenBuffers)
请看这里,我正在尝试运行的简单程序:
require "lib_gl"
x = [] of UInt32
# or
x = uninitialized Pointer(UInt32)
# or
x = [0_u32]
# From lib_gl:
# fun gen_buffers = "glGenBuffers"(n: Int32, buffers: UInt32*) : Void
LibGL.gen_buffers(1, x)
将因以下错误而崩溃:
Invalid memory access (signal 11) at address 0x1428
[0x10560900b] *CallStack::print_backtrace:Int32 +107
[0x1055f4a2c] __crystal_sigfault_handler +60
[0x7fff90988b3a] _sigtramp +26
[0x7fff7f455e83] glGenBuffers +19
[0x1055e4836] __crystal_main +1222
[0x1055f4928] main +40
我是 Crystal 的新手,所以我不确定我是否在将 x
的值传递给函数时做错了什么,或者是否有更深层次的东西绑定或 crystal 本身有问题。希望这里的 Crystal+OpenGL 专家可以提供帮助!
参考文献:
- Crystal OpenGL 绑定:https://github.com/lirith-engine/lib_gl/blob/master/src/lib_gl.cr#L6443
- OpenGL glGenBuffers:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenBuffers.xhtml
我在发帖前回答了我自己的问题,但仍然认为应该分享:
如果没有初始化的 OpenGL 上下文,就会发生这种情况。下面是一个修改后的(工作)示例,使用 GLFW 和 LibGLFW 库打开 window 并设置当前上下文:
require "glfw"
require "lib_glfw"
require "lib_gl"
LibGLFW.init
window = GLFW::Window.new(800, 600, "Foo")
window.set_context_current
x = [0_u32]
LibGL.gen_buffers(1, x)
puts x
不过请注意,必须使用预期数量的 "return" 值来初始化数组。使用 x = [] of UInt32
会因同样的错误而崩溃。因此,请确保您已经创建了一个包含 n 个 0 的数组,其中 n 是您要求初始化的缓冲区数量。
请看这里,我正在尝试运行的简单程序:
require "lib_gl"
x = [] of UInt32
# or
x = uninitialized Pointer(UInt32)
# or
x = [0_u32]
# From lib_gl:
# fun gen_buffers = "glGenBuffers"(n: Int32, buffers: UInt32*) : Void
LibGL.gen_buffers(1, x)
将因以下错误而崩溃:
Invalid memory access (signal 11) at address 0x1428
[0x10560900b] *CallStack::print_backtrace:Int32 +107
[0x1055f4a2c] __crystal_sigfault_handler +60
[0x7fff90988b3a] _sigtramp +26
[0x7fff7f455e83] glGenBuffers +19
[0x1055e4836] __crystal_main +1222
[0x1055f4928] main +40
我是 Crystal 的新手,所以我不确定我是否在将 x
的值传递给函数时做错了什么,或者是否有更深层次的东西绑定或 crystal 本身有问题。希望这里的 Crystal+OpenGL 专家可以提供帮助!
参考文献:
- Crystal OpenGL 绑定:https://github.com/lirith-engine/lib_gl/blob/master/src/lib_gl.cr#L6443
- OpenGL glGenBuffers:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGenBuffers.xhtml
我在发帖前回答了我自己的问题,但仍然认为应该分享:
如果没有初始化的 OpenGL 上下文,就会发生这种情况。下面是一个修改后的(工作)示例,使用 GLFW 和 LibGLFW 库打开 window 并设置当前上下文:
require "glfw"
require "lib_glfw"
require "lib_gl"
LibGLFW.init
window = GLFW::Window.new(800, 600, "Foo")
window.set_context_current
x = [0_u32]
LibGL.gen_buffers(1, x)
puts x
不过请注意,必须使用预期数量的 "return" 值来初始化数组。使用 x = [] of UInt32
会因同样的错误而崩溃。因此,请确保您已经创建了一个包含 n 个 0 的数组,其中 n 是您要求初始化的缓冲区数量。