Java LWJGL:glpaurements()导致本机代码崩溃
我试图画一个基本的立方体;在这一点上,我甚至不担心透视投影,我只是想在屏幕上不出现崩溃。当我调用带有以下错误消息的Java LWJGL:glpaurements()导致本机代码崩溃,java,scala,lwjgl,Java,Scala,Lwjgl,我试图画一个基本的立方体;在这一点上,我甚至不担心透视投影,我只是想在屏幕上不出现崩溃。当我调用带有以下错误消息的glpaurements()时发生崩溃: # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x00007fff838fdbdd, pid=683, tid=1811 # # JRE version: Java(TM) SE Runtime Envir
glpaurements()
时发生崩溃:
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007fff838fdbdd, pid=683, tid=1811
#
# JRE version: Java(TM) SE Runtime Environment (8.0_51-b16) (build 1.8.0_51-b16)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.51-b03 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C [GLEngine+0x159bdd] gleRunVertexSubmitImmediate+0x42d
...
# The crash happened outside the Java Virtual Machine in native code.
我的立方体顶点和元素存储在文字数组中:
val cubeVertices = Array[Float] (
// Front face
-1.0f, -1.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, 1.0f,
... // Other faces also defined in same manner
)
val cubeElements = Array[Short] (
0, 1, 2, 0, 2, 3, // front
4, 5, 6, 4, 6, 7, // back
8, 9, 10, 8, 10, 11, // top
12, 13, 14, 12, 14, 15, // bottom
16, 17, 18, 16, 18, 19, // right
20, 21, 22, 20, 22, 23 // left
)
我的窗口创建代码如下:
glfwInit()
glfwDefaultWindowHints()
glfwWindowHint(GLFW_VISIBLE, GL_FALSE)
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3)
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2)
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
val window = glfwCreateWindow(1024, 768, "Hello!", NULL, NULL)
glfwMakeContextCurrent(window)
glfwSwapInterval(1)
glfwShowWindow(window)
GLContext.createFromCurrent()
initDraw()
while (glfwWindowShouldClose(window) == GL_FALSE) {
glfwWaitEvents()
draw()
glfwSwapBuffers(window)
}
val cubeVertexNIOBuffer = createFloatBuffer(cubeVertices.length)
cubeVertexNIOBuffer.put(cubeVertices)
val cubeVertexBuffer = glGenBuffers()
glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer)
glBufferData(GL_ARRAY_BUFFER, cubeVertexNIOBuffer, GL_STATIC_DRAW)
val cubeElementNIOBuffer = createShortBuffer(cubeElements.length)
cubeElementNIOBuffer.put(cubeElements)
val cubeElementBuffer = glGenBuffers()
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeElementBuffer)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, cubeElementNIOBuffer, GL_STATIC_DRAW)
cubeVertexArray = glGenVertexArrays()
glBindVertexArray(cubeVertexArray)
glEnableVertexAttribArray(0)
glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer)
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeElementBuffer)
... // Shader compilation and linking stuff
glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glUseProgram(shaderProgram)
glBindVertexArray(cubeVertexArray)
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0)
initDraw()
的定义如下:
glfwInit()
glfwDefaultWindowHints()
glfwWindowHint(GLFW_VISIBLE, GL_FALSE)
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3)
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2)
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
val window = glfwCreateWindow(1024, 768, "Hello!", NULL, NULL)
glfwMakeContextCurrent(window)
glfwSwapInterval(1)
glfwShowWindow(window)
GLContext.createFromCurrent()
initDraw()
while (glfwWindowShouldClose(window) == GL_FALSE) {
glfwWaitEvents()
draw()
glfwSwapBuffers(window)
}
val cubeVertexNIOBuffer = createFloatBuffer(cubeVertices.length)
cubeVertexNIOBuffer.put(cubeVertices)
val cubeVertexBuffer = glGenBuffers()
glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer)
glBufferData(GL_ARRAY_BUFFER, cubeVertexNIOBuffer, GL_STATIC_DRAW)
val cubeElementNIOBuffer = createShortBuffer(cubeElements.length)
cubeElementNIOBuffer.put(cubeElements)
val cubeElementBuffer = glGenBuffers()
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeElementBuffer)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, cubeElementNIOBuffer, GL_STATIC_DRAW)
cubeVertexArray = glGenVertexArrays()
glBindVertexArray(cubeVertexArray)
glEnableVertexAttribArray(0)
glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer)
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeElementBuffer)
... // Shader compilation and linking stuff
glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glUseProgram(shaderProgram)
glBindVertexArray(cubeVertexArray)
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0)
最后,draw()
的定义如下:
glfwInit()
glfwDefaultWindowHints()
glfwWindowHint(GLFW_VISIBLE, GL_FALSE)
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3)
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2)
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)
val window = glfwCreateWindow(1024, 768, "Hello!", NULL, NULL)
glfwMakeContextCurrent(window)
glfwSwapInterval(1)
glfwShowWindow(window)
GLContext.createFromCurrent()
initDraw()
while (glfwWindowShouldClose(window) == GL_FALSE) {
glfwWaitEvents()
draw()
glfwSwapBuffers(window)
}
val cubeVertexNIOBuffer = createFloatBuffer(cubeVertices.length)
cubeVertexNIOBuffer.put(cubeVertices)
val cubeVertexBuffer = glGenBuffers()
glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer)
glBufferData(GL_ARRAY_BUFFER, cubeVertexNIOBuffer, GL_STATIC_DRAW)
val cubeElementNIOBuffer = createShortBuffer(cubeElements.length)
cubeElementNIOBuffer.put(cubeElements)
val cubeElementBuffer = glGenBuffers()
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeElementBuffer)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, cubeElementNIOBuffer, GL_STATIC_DRAW)
cubeVertexArray = glGenVertexArrays()
glBindVertexArray(cubeVertexArray)
glEnableVertexAttribArray(0)
glBindBuffer(GL_ARRAY_BUFFER, cubeVertexBuffer)
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeElementBuffer)
... // Shader compilation and linking stuff
glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glUseProgram(shaderProgram)
glBindVertexArray(cubeVertexArray)
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0)
我已经确认glpaurements()
是罪魁祸首,因为当调用被注释掉时,代码运行时不会崩溃。我还相当确定着色器代码不是罪魁祸首,因为调用glUseProgram()
不会生成OpenGL错误
我还应该注意到,对
glDrawArrays()
的常规调用也会以同样的方式崩溃。我认为在用数据填充缓冲区后,需要将其倒带。在两个bufferNIOBuffer
对象上的.put()
调用之后,尝试调用.position(0)
。@RetoKoradi成功了!非常感谢。