使用 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 专家可以提供帮助!

参考文献:

我在发帖前回答了我自己的问题,但仍然认为应该分享:

如果没有初始化的 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 是您要求初始化的缓冲区数量。