Я не знаю, можно ли здесь "поднять" старый вопрос, но мне пришло в голову несколько вещей:
Если ваши вокселы статичны, вы можете ускорить весь процесс рендеринга, используя октрое для отбраковки усеченного конуса и т. Д. Кроме того, вы также можете скомпилировать статическую сцену в набор потенциальной видимости в октри. Основной принцип PVS состоит в том, чтобы предварительно вычислить для каждого узла в дереве, какие другие узлы потенциально видны из него, и сохранить указатели на них в векторе. Когда дело доходит до рендеринга, сначала проверьте, в каком узле размещена камера, а затем запустите отбраковку усеченного контура для всех узлов в PVS-векторе узла (Кармак использовал нечто подобное в движках Quake, но с деревьями Binary Space Partitioning).
Если затенение ваших вокселей довольно сложное, также можно быстро выполнить только перед глубиной, не записывая в цветовой буфер, только для заполнения Глубинного буфера. После этого вы выполняете 2-й проход: отключите запись в Depthbuffer и выполняете рендеринг только в Colorbuffer при проверке Depthbuffer. Таким образом, вы избегаете дорогих шейдерных вычислений, которые впоследствии перезаписываются новым фрагментом, который ближе к зрителю (Кармак использовал это в Quake3)
Другая вещь, которая определенно ускорит вещи, - это использование Instancing. Вы сохраняете только положение каждого вокселя и, если необходимо, его масштаб и другие параметры в объекте текстурного буфера. В вершинном шейдере вы можете затем прочитать позиции вокселей, которые должны быть созданы, и создать экземпляр вокселя (то есть куб, который передается шейдеру в объекте вершинного буфера). Таким образом, вы отправляете 8 вершин + 8 нормалей (3 * sizeof (float) * 8 +3 * sizeof (float) * 8 + float для цвета / текстуры и т. Д.) Только один раз на карту в VBO, а затем только позиции экземпляров Куба (3 * sizeof (float) * количество вокселей) в TBO.
Возможно, есть возможность распараллелить вещи между GPU и CPU, объединив все 3 шага в 2 потока, в потоке CPU вы проверяете pvs octrees и обновляете TBO для создания экземпляров в следующем кадре, тем временем поток GPU делает рендеринг 2 проходов при использовании TBO для создания экземпляров, который был создан потоком ЦП на предыдущем шаге. После этого вы переключаете TBO. Если камера не сдвинулась, вам даже не нужно снова выполнять вычисления CPU.
Другим видом дерева, которое меня интересует, является так называемое k-d-дерево, которое является более общим, чем октреи.
PS: извините за мой английский, это не самый ясный ....