Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LWJGL:glpaurements()导致本机代码崩溃_Java_Scala_Lwjgl - Fatal编程技术网

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()
的常规调用也会以同样的方式崩溃。

我认为在用数据填充缓冲区后,需要将其倒带。在两个buffer
NIOBuffer
对象上的
.put()
调用之后,尝试调用
.position(0)
。@RetoKoradi成功了!非常感谢。