Небольшой вопрос по построению вокселей

Делаю свою игру, работало всё нормально, пока не добавил полублоки, ступеньки и прозрачные блоки. Всё это сильно усложняет алгоритм построения сетки полигонов (вокселей) чанка, из за чего появились дикие фризы при прогрузке чанков на мобилках. У меня этот алгоритм работает так:
есть трёхмерный массив айди блоков blocks. По нему проходит цикл. Если справа стоит блок воздуха или нижний или верхний полублок или ступеньки или блок воздуха или прозрачный блок, то построить правую грань блока. и так 6 раз для всех сторон. Жутко неудобно и условие у if гигантское, поэтому и тормоза. Может, надо не смотреть на соседние блоки и строить воксели этого блока, а наоборот, строить грани соседних с ним блоков? Тогда алгоритм выглядит примерно так:
проходим по массиву. Берём blocks[x, y, z]. Смотрим, с какой стороны он прозрачный (например, блок листвы или воздуха прозрачен со всех сторон, нижний полублок со всех, кроме нижней и т.д). Если он прозрачный снизу, то строим верхнюю сторону блока снизу, если прозрачный сверху, то строим нижнюю сторону блока сверху и т.д.
Какой вариант используется в майнкрафте?
Вот так это реализовано сейчас у меня:

if((y < 510 && bloks[x, y + 1, z] == BlockType.Air)) // || (y < 510 && Block.render[bloks[x, y + 1, z]] == RenderType.transparentBlock || (y < 510 && Block.render[bloks[x, y + 1, z]] == RenderType.upper_halfBlock)
{
Vpos = Block.blocks[thisBT].returnVerts(0);
verts.Add(blockPos + Vpos[0]);
verts.Add(blockPos + Vpos[1]);
verts.Add(blockPos + Vpos[2]);
verts.Add(blockPos + Vpos[3]);
numFaces++;
uvs.AddRange(Block.blocks[bloks[x, y, z]].topPos.GetUVs());
}
Есть 6 штук вот таких вот блоков кода, которые выполняются для каждого из 18 * 512 * 18 блоков в чанке
Код написан на c#. Но синтаксис очень похож на java
 
Сверху