GPU COMPUTE & VULKAN PIPELINE

Mesh Shaders в Minecraft: аппаратный рендеринг чанков через Nvidium

TL;DR: Модуль Nvidium в сборках Minecrafter-X перенаправляет геометрию воксельного мира на аппаратный пайплайн NV_mesh_shader. Вся процедура отсечения невидимой геометрии (Frustum/Occlusion Culling) выполняется на вычислительных ядрах GPU, позволяя играть на дистанции 64 чанка с 200+ FPS.

1. Предел классического конвейера рендеринга

На протяжении 15 лет Minecraft использует классический графический конвейер OpenGL. Даже с оптимизациями великого мода Sodium процессор тратит огромное количество тактов на обход графа сцены, расчет видимости секций чанков и отправку команд отрисовки glMultiDrawElementsIndirect.

При повышении дальности прорисовки выше 24–32 чанков количество вертексов в кадре превышает десятки миллионов. Центральный процессор захлебывается в системных вызовах драйвера, а мощная дискретная видеокарта (уровня RTX 4070 или RTX 3060) оказывается недогруженной на 30–40%.

2. Парадигма Mesh Shaders и отказ от вершинных буферов

Технология Mesh Shaders (впервые представленная в архитектуре NVIDIA Turing и ставшая стандартом в DirectX 12 Ultimate и Vulkan) полностью заменяет связку Vertex Shader, Geometry Shader и фиксированного ассемблера примитивов.

Вместо последовательной обработки отдельных вершин графический процессор оперирует небольшими кластерами геометрии — мешлетами (Meshlets), содержащими до 64 вершин и 126 треугольников. Это позволяет вычислять геометрию вокселей параллельными волнами потоков (Warp) со скоростью кэша первого уровня L1.

3. Аппаратный Frustum & Occlusion Culling на GPU

Главный секрет экстремальной производительности Nvidium — перенос логики отсечения из Java-потоков на Task Shader. Перед вызовом отрисовки Task Shader берет ограничивающий параллелепипед (Bounding Box) чанка и проверяет его пересечение с пирамидой видимости камеры игрока (Frustum Culling), а также с картой глубины предыдущего кадра (Hi-Z Occlusion Culling).

Если чанк находится за холмом или вне поля зрения, весь поток геометрии отбрасывается аппаратным блоком GPU, не доходя до этапа растеризации.

shaders/nvidium/cluster_cull.task — Вычислительный отсев мешлетов
#version 460
#extension GL_NV_mesh_shader : require

layout(local_size_x = 32) in;

struct ChunkBoundingBox {
    vec4 min_bounds;
    vec4 max_bounds;
};

layout(std430, binding = 0) readonly buffer ChunkBoundsBuffer {
    ChunkBoundingBox chunks[];
};

uniform mat4 u_ViewProjectionMatrix;
uniform vec3 u_CameraPosition;

bool IsChunkInFrustum(vec3 min_p, vec3 max_p) {
    // Векторная проверка 6 плоскостей видимости Frustum в один такт
    for (int i = 0; i < 6; ++i) {
        // Вычисление нормального расстояния
        if (dot(get_frustum_plane(i), vec4(mix(min_p, max_p, get_p_vertex(i)), 1.0)) < 0.0) {
            return false; // Отсекаем невидимый кластер
        }
    }
    return true;
}

void main() {
    uint chunk_idx = gl_GlobalInvocationID.x;
    ChunkBoundingBox box = chunks[chunk_idx];

    bool visible = IsChunkInFrustum(box.min_bounds.xyz, box.max_bounds.xyz);

    // Выделяем рабочие группы Mesh Shader только для видимых кластеров
    uvec4 ballot = subgroupBallot(visible);
    uint visible_count = subgroupBallotBitCount(ballot);

    if (gl_LocalInvocationIndex == 0) {
        gl_TaskCountNV = visible_count;
    }
}

4. Бенчмарк: дальность 64 чанка в разрешении 1440p

При тестировании на тестовом стенде (Core i7-13700K, GeForce RTX 4070 12GB, 32 GB RAM, разрешение 2560x1440):

  • Sodium (Vanilla OpenGL): 32 чанка — 115 FPS; 64 чанка — 34 FPS (падение из-за лимита шины CPU-GPU).
  • Nvidium Mesh Pipeline: 32 чанка — 380 FPS; 64 чанка — 225 FPS при безупречно ровном фреймтайме в 4.4 миллисекунды.

Модуль Nvidium включен по умолчанию в редакции Competitive Core и Vanilla+ клиента Minecrafter-X и активируется автоматически при наличии видеокарты NVIDIA GeForce архитектур Turing, Ampere, Ada Lovelace или Blackwell.

Редакции клиента