每当我使用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
的第一个参数必须是缓冲区对象绑定到的目标(GL_ELEMENT_ARRAY_BUFFER
(,而不是命名的缓冲区对象。glBufferData
会影响绑定到目标的命名缓冲区。
使用以下代码来解决您的问题:
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, elementBuffer );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices, GL_STATIC_DRAW );