Воксельная игра: рендеринг блокирует разные способы и производительность

Я делаю игру, похожую на Minecraft, с использованием OpenGL, и мне интересно, какое решение является лучшим для гибкого рендеринга без потери производительности. Я имею в виду, что есть разные типы блоков с разными способами рисования: обычные блоки — это простые кубы с текстурами, лестницы — более сложные, а жидкие блоки, такие как вода и лава, нуждаются в обновлении текстуры. У меня есть кусок со списком отображения. Каждый блок имеет свой тип (значение байта). По этому значению я могу найти "полное" представление блока (оно является общим для всех блоков одного типа и содержит имя, метод рисования и дополнительную информацию). Теперь мне нужно убрать отрисовку невидимых граней (если у блока есть сосед слева, нам не нужно рисовать его левую грань). Но это означает, что мне нужно передать 6 аргументов в метод рисования (или массив, или маску). Это хороший способ рисования, или я выбрал глупое решение? Что вы можете порекомендовать для рисования разных типов блоков по-своему?

for(int x = 0; x < 16; x++){
        for(int y = 0; y < 128; y++){
            for(int z = 0; z < 16; z++){    
                GL11.glPushMatrix();
                    GL11.glTranslatef(x, y, z);
                    BlockTypes.getBlockType(blocks[x][y][z].type).draw();                   
                GL11.glPopMatrix();
            }
        }
    }       

person Pavel Rudko    schedule 02.02.2015    source источник


Ответы (1)


Я рекомендую использовать VBO для каждого фрагмента и шейдеров, а не список отображения и фиксированный конвейер (который на самом деле устарел).

Использование VBO дает множество преимуществ. Он позволяет использовать шейдеры, обеспечивая гораздо большую гибкость, чем фиксированный конвейер. С помощью шейдеров вы можете отправлять данные текстуры, данные цвета и т. д. отдельно от данных вершин/индексов. Кроме того, VBO в целом быстрее.

Один из способов, которым VBO обеспечивают большую гибкость, — это вода и лава, которые требуют обновления текстур, которые можно вызывать отдельно от буферизации, что снижает необходимость повторной буферизации всего фрагмента.

Что касается невидимого обнаружения лица, я считаю, что это единственный способ сделать это. Вместо того, чтобы передавать 6 аргументов, просто передайте чанк методу. Вы также можете создать метод, который извлекает блоки, окружающие блок, который вы проверяете.

person Benjamin Cheng    schedule 02.02.2015
comment
Пожалуйста, не используйте рекомендации, а основывайте свои ответы на фактах - person Anthony Pham; 03.02.2015