У меня есть проблема в моем проекте, когда я пытаюсь нарисовать пирамиду на экране, но глубина не отображается.
public void create(float[] vertices, int[] indices, int numberOfVertices, int numberOfIndices) {
indexCount = numberOfIndices;
vao = gl.genVertexArrays();
gl.bindVertexArray(vao);
IntBuffer indicesBuffer = factory.create(indices);
ibo = gl.genBuffers();
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);
FloatBuffer verticesBuffer = factory.create(vertices);
vbo = gl.genBuffers();
gl.bindBuffer(GL_ARRAY_BUFFER, vbo);
gl.bufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW);
gl.vertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
gl.enableVertexAttribArray(0);
gl.bindBuffer(GL_ARRAY_BUFFER, 0);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl.bindVertexArray(0);
}
Я создаю свой объект сетки со следующим кодом, в котором вершины и индексы определены как:
private void createTriangles() {
float[] vertices = new float[] {
//x y z
-1.0f, -1.0f, 0.0f, //0
0.0f, 0.0f, 1.0f, //1
1.0f, -1.0f, 0.0f, //2
0.0f, 1.0f, 0.0f //3
};
int[] indices = new int[] {
0, 3, 1,
1, 3, 2,
2, 3, 0,
0, 1, 2
};
mesh.create(vertices, indices, 12, 12);
}
Чтобы отобразить их на экране, я вызываю функцию рендеринга из игрового цикла.который определяется как.
public void render() {
gl.bindVertexArray(vao);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
gl.drawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gl.bindVertexArray(0);
}
Для создания моих FloatBuffer и IntBuffer у меня есть фабричный класс, определенный как.
public class BufferFactory {
public IntBuffer create(int[] indices) {
IntBuffer buffer = BufferUtils.createIntBuffer(indices.length);
buffer.put(indices);
buffer.flip();
return buffer;
}
public FloatBuffer create(float[] vertices) {
FloatBuffer buffer = BufferUtils.createFloatBuffer(vertices.length);
buffer.put(vertices);
buffer.flip();
return buffer;
}
}
Так что проблема, которую я получаю, заключается в том, что она должна была нарисоватьчетыре треугольника на экране, чтобы сформировать пирамиду, однако мой вывод выглядит следующим образом.
![enter image description here](https://i.stack.imgur.com/W2lzD.png)
Я повернул изображение, чтобы попытаться увидеть глубину, но это плоский объект.
Я попытался определить, откуда может возникнуть проблема, пытаясь нарисовать каждый треугольник по отдельности, изменив метод рендеринга на gl.drawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
, чтобы он рисовал только один треугольник.Я попытался нарисовать все четыре лица по отдельности, и все они нарисованы на экране.