【发布时间】:2018-09-29 21:04:13
【问题描述】:
每当我使用 GL_ELEMENT_ARRAY_BUFFER 绘制对象时,GLFW 都会在 glfwSwapBuffers(); 上抛出一个段错误
这是有问题的代码:
public Mesh( float[] verts, int[] indices ) {
indicesCount = indices.length;
vertexBuffer = glGenBuffers();
elementBuffer = glGenBuffers();
vertexArray = glGenVertexArrays();
glBindVertexArray( vertexArray );
glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer );
glBufferData( GL_ARRAY_BUFFER, verts, GL_STATIC_DRAW );
glVertexAttribPointer( 0, 3, GL_FLOAT, false, 6 * 4, 0 * 4 );
glEnableVertexAttribArray( 0 );
glVertexAttribPointer( 1, 3, GL_FLOAT, false, 6 * 4, 3 * 4 );
glEnableVertexAttribArray( 1 );
// Uncommenting this code causes segfault
//glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, elementBuffer );
//glBufferData( elementBuffer, indices, GL_STATIC_DRAW );
glBindVertexArray( 0 );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
}
public void draw() {
glBindVertexArray( vertexArray );
//glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, elementBuffer );
//glDrawElements( GL_TRIANGLES, indicesCount, GL_UNSIGNED_INT, 0 );
glDrawArrays( GL_TRIANGLES, 0, 3 );
glBindVertexArray( 0 );
}
段错误是由这段代码引起的:
System.out.println( "Hello" ); // <- Would get printed
glfwSwapBuffers( windowID ); // <- SIGSEGV
System.out.println( "Hello2" ); // <- Would not get printed
我正在使用最新的 LWJGL 版本 3.2.0,虽然我也尝试过 3.1.6,但无济于事。我完全迷失了,如果没有任何效果,我想我只能坚持使用 C++,因为相同的代码在那里可以完美运行。
【问题讨论】:
-
glBufferData(elementBuffer, indices, GL_STATIC_DRAW) 应该读取 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices, GL_STATIC_DRAW)
-
另外注意(尽管这与错误无关):绑定到 GL_ELEMENT_ARRAY_BUFFER 的缓冲区是 VAO 状态的一部分,因此您无需在取消绑定 VAO 后将 GL_ELEMENT_ARRAY_BUFFER 取消绑定为 0。绑定 VAO 后,您也无需在 draw 方法中重新绑定 GL_ELEMENT_ARRAY_BUFFER,因为 VAO 会记住上次绑定 VAO 时对 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...) 的调用。
标签: java opengl segmentation-fault lwjgl glfw