Я пытаюсь использовать массивы вершин для рендеринга около 2097152 кубов с LWJGL (нет, не все сразу). Я реализовал множество типов отбраковки полигонов, чтобы повысить свою производительность примерно с 2 кадров в секунду до примерно 60 кадров в секунду. На протяжении всего этого проекта я работал с рендерингом Immediate Mode, и я думаю, что пришло время для обновления. И здесь на помощь приходят массивы вершин.
Я не хочу использовать VBO, поэтому пока экспериментирую с VAO. Кажется, я не могу найти практичный (или эффективный) метод рендеринга. К сожалению, все, что я пробую, дает мне худший FPS, чем Immediate Mode. В каждом кадре я загружаю FloatBuffer для каждого куба с видимыми полигонами, а затем рисую их, используя обычные методы массива вершин. Эта настройка вызывает у меня головную боль, потому что я получаю меньше FPS, чем при использовании Immediate Mode и без отбраковки полигонов.
Я думаю, что делаю что-то не так. Итак, среди всех вас, ярких, амбициозных программистов OpenGL/LWJGL, кто-нибудь знает, как это можно сделать более эффективным и действенным способом?
Вот мой код для рендеринга (усеченный, чтобы не было слишком много беспорядка):
for(int z = 0; z < chunk.bpc; z++) {
for(int y = 0; y < chunk.bpc; y++) {
for(int x = 0; x < chunk.bpc; x++) {
if(((z == chunk.bpc - 1 || z == 0) || (y == chunk.bpc - 1 || y == 0) || (x == chunk.bpc - 1 || x == 0))
&& chunk.data[(x * chunk.bpc + z) * chunk.bpc + y] == i) {
List<Float> vertices = new ArrayList<Float>();
float xp = x + locX, yp = y + locY, zp = z + locZ;
if(z == chunk.bpc - 1 && chunk.z$ == null) {
vertices.add(xp); vertices.add(yp); vertices.add(zp + size);
vertices.add(xp + size); vertices.add(yp); vertices.add(zp + size);
vertices.add(xp + size); vertices.add(yp + size); vertices.add(zp + size);
vertices.add(xp); vertices.add(yp + size); vertices.add(zp + size);
}
if(z == 0 && chunk.z_ == null) {
vertices.add(xp); vertices.add(yp); vertices.add(zp);
vertices.add(xp); vertices.add(yp + size); vertices.add(zp);
vertices.add(xp + size); vertices.add(yp + size); vertices.add(zp);
vertices.add(xp + size); vertices.add(yp); vertices.add(zp);
}
if(y == chunk.bpc - 1 && chunk.y$ == null) {
vertices.add(xp); vertices.add(yp + size); vertices.add(zp);
vertices.add(xp); vertices.add(yp + size); vertices.add(zp + size);
vertices.add(xp + size); vertices.add(yp + size); vertices.add(zp + size);
vertices.add(xp + size); vertices.add(yp + size); vertices.add(zp);
}
if(y == 0 && chunk.y_ == null) {
vertices.add(xp); vertices.add(yp); vertices.add(zp);
vertices.add(xp + size); vertices.add(yp); vertices.add(zp);
vertices.add(xp + size); vertices.add(yp); vertices.add(zp + size);
vertices.add(xp); vertices.add(yp); vertices.add(zp + size);
}
if(x == chunk.bpc - 1 && chunk.x$ == null) {
vertices.add(xp + size); vertices.add(yp); vertices.add(zp);
vertices.add(xp + size); vertices.add(yp + size); vertices.add(zp);
vertices.add(xp + size); vertices.add(yp + size); vertices.add(zp + size);
vertices.add(xp + size); vertices.add(yp); vertices.add(zp + size);
}
if(x == 0 && chunk.x_ == null) {
vertices.add(xp); vertices.add(yp); vertices.add(zp);
vertices.add(xp); vertices.add(yp); vertices.add(zp + size);
vertices.add(xp); vertices.add(yp + size); vertices.add(zp + size);
vertices.add(xp); vertices.add(yp + size); vertices.add(zp);
}
float[] verts = new float[vertices.size()];
for(int a = 0; a < verts.length; a++) {
verts[a] = vertices.get(a);
}
FloatBuffer cubeBuffer = BufferUtils.createFloatBuffer(verts.length);
cubeBuffer.put(verts);
cubeBuffer.flip();
GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glVertexPointer(3, 0, cubeBuffer);
GL11.glDrawArrays(GL11.GL_QUADS, 0, verts.length / 3);
GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
}
}
}
}
(Просто игнорируйте некоторые из этих переменных, они просто отбирают разные полигоны)
Поэтому я не знаю, есть ли более эффективный способ сделать это, но если есть, было бы неплохо, если бы я мог получить несколько указателей. Заранее спасибо! О, и...
ЕСТЬ ЧТО-ТО ОЧЕНЬ НЕПРАВИЛЬНО В ТОМ, КАК Я ВИЗУАЛИЗИРУЮ.