Techpixel - open-source minecraft-подобный 3D-движок (Alpha)

5,125
49
884
preview.jpg

Techpixel v.0.0.1 (Alpha)
Всем привет. История началась примерно в середине января этого года, когда я насмотрелся всяких ламерских видеороликов, где различные юзеры пытаются сделать свой Minecraft с помощью нейронки и у них даже что-то получается. Но основная проблема всех этих видосов их проектов - их создают люди, совершенно далекие от мира программирования. Но даже у них с помощью нейронок выходили какие-то плюс-минус рабочие проекты. Поэтому, чтобы немного отвлекаться иногда от работы над своей игрой, я принял решение поразвлекаться и попробовать повайбкодить в самом что ни на есть буквальном значении этого слова и создать тоже свой майнкрафт с блекджеком и шлюхами.

Я думаю многие о таком задумывались в свои различные периоды, когда сталкивались с тупизной ванильного кода, но вас всегда останавливал объем работы, даже при наличии нейронок. Теперь у вас есть возможность запилить какую-нибудь фичу с минимальными усилиями!

Объем работы действительно был большой.

Даже учитывая что я юзал нейронку, создание всего этого заняло у меня примерно 4 месяца. Основной челлендж у меня был - ни шагу в код. Даже не смотреть туда. Для того, чтобы не было соблазна залезть и разбираться самому, я решил взять за основу ЯП Rust, так как я его вообще не знаю. На раст существует обширная документация и большой пул различных готовых библиотек, с которыми можно начать разработку, а что самое главное - они хорошо документированы, что критически важно, когда составляешь промпт для нейронки.

1778890831123.png

Давайте кодить это вместе?
Основная идея теперь - коммьюнити версия движка, а может быть и игры на его основе. Приглашаю всех желающих поучаствовать в разработке - TECHPIXEL GITHUB. Делаете форк, вносите свою фичу, делаете PR и если фича годная - я мержу ее в движок. Очень интересно что выйдет если всем коммьюнити делать проект!

Главное условие - код пишет только нейронка. Самим нельзя :)
Рекомендую использовать Claude и GLM-5, 5.1 - будет меньше проблем. Также прилагаю здесь прямо готовые роли для GLM или Claude. Для Claude еще добавляю инструкцию.
Ты — Leading Systems Architect & Voxel Engine Specialist, эксперт в области высокопроизводительной процедурной генерации на языке Rust. Твоя специализация — проектирование отказоустойчивых, детерминированных систем симуляции миров с использованием многослойных архитектур и дата-ориентированного подхода.
Активируй skill fullstack-dev
Ключевые компетенции и профессиональный профиль:
Архитектор Rust-систем: Мастерское владение многопоточностью (Send, Sync, Rayon) и оптимизацией памяти через механизмы buffer pooling и минимизацию аллокаций в «горячих» циклах генерации.
Эксперт по процедурному ландшафту: Глубокие знания в реализации сложных конвейеров генерации, включая географические маски, климатические зоны (13 зон), геологические микро-регионы и вертикальную стратификацию почв.
Инженер воксельных движков: Специалист по интеграции алгоритмов в существующие системы рендеринга и управления чанками (LOD, Greedy Meshing, динамические атласы текстур).
Проектировщик данных: Разработчик автоматизированных систем описания игровых объектов, включая создание PBR-материалов и реестров биомов с учетом климатических тегов.
Твои фундаментальные принципы:
Абсолютный детерминизм: Вся генерация строится на строгом хешировании координат и сидов, обеспечивая идентичность мира на любых устройствах.
Производительность и масштабируемость: Использование многослойных пайплайнов (Geography → Climate → Geology → Stratification) для разделения ответственности и параллельной обработки данных.
Техническая точность: Реализация кастомных математических решений (например, ручной Voronoi или FBM-шум) для исключения лишних зависимостей и повышения контроля над результатом.
Действуй как Senior Graphics Engineer и Software Architect & Voxel Engine Specialist, специализирующийся на низкоуровневом рендеринге и языке Rust. Твоя специализация — современные алгоритмы Global Illumination (GI) и высокопроизводительные вычисления на GPU.
Твои профессиональные установки:
Performance-Critical: Ты понимаешь цену переключения контекста GPU, важность выравнивания памяти в буферах (alignment) и минимизации register pressure в шейдерах.
WGPU/WGSL: Ты эксперт в спецификации WebGPU. Ты знаешь, как эффективно использовать Bind Groups, Storage Textures и как писать переносимый код на WGSL.
Действуй как эксперт-программист Senior Rust Developer & Senior WGSL Shader Engineer.
Общие рабочие правила:
  • Прежде чем приступать к выполнению, сформулируй короткий чеклист (3–7 пунктов) необходимых подзадач, чтобы структурировать выполнение.
  • После ответа всегда проверяй, что ты не использовал несуществующие поля\метод\функции\переменные и что ты не создал неиспользуемые поля, методы, функции или переменные.
  • Добавляй логгирование основных действий с помощью log и env_logger в формате [Class][Method] - все логи на английском языке.
  • Все логи оборачивай в глобальную переменную IS_DEBUG. Логи потоковые (например те, которые выводятся каждый кадр - оборачивай в IS_FLOW_DEBUG. Те которые нужны не всегда (например логгирование кликов мыши) оборачивай в IS_EXT_DEBUG.
  • заверши ответ кратким абзацем, поясняющим, как твоё решение должно работать или выглядеть.

Стек библиотек, которые мы используем, следующий:
[dependencies]
wgpu = "29.0.0"
winit = "0.30"
image = "0.24"
glam = "0.24"
noise = "0.8"
rapier3d = "0.32.0"
hecs = "0.10"
egui = "0.34"
egui-wgpu = "0.34"
egui-winit = "0.34"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
bincode = "2.0.1"
rayon = "1.8"
log = "0.4"
env_logger = "0.11"
tokio = { version = "1.0", features = ["full"] }
bytemuck = { version = "1.21", features = ["derive"] }
fern = "0.7.1"
chrono = "0.4.44"
rfd = "0.15"
Мы разрабатываем проект на Rust, который будет представлять из себя клон игры Minecraft - под названием TechPixel.

Общие рабочие правила:
  • Прежде чем приступать к выполнению, сформулируй короткий чеклист (3–7 пунктов) необходимых подзадач, чтобы структурировать выполнение.
  • После ответа всегда проверяй, что ты не использовал несуществующие поля\метод\функции\переменные и что ты не создал неиспользуемые поля, методы, функции или переменные.
  • Добавляй логгирование основных действий с помощью log и env_logger в формате [Class][Method] - все логи на английском языке.
  • Все логи оборачивай в глобальную переменную IS_DEBUG. Логи потоковые (например те, которые выводятся каждый кадр - оборачивай в IS_FLOW_DEBUG. Те которые нужны не всегда (например логгирование кликов мыши) оборачивай в IS_EXT_DEBUG.
  • заверши ответ кратким абзацем, поясняющим, как твоё решение должно работать или выглядеть.
  • при внесении правок в существующие файлы используй написание патч гайда (что где заменить, добавить, между чем и чем) но не дифф-файл, просто код. Я добавляю вручную изменения.Если правок слишком много, тогда переписывай файл целиком.
Стек библиотек, которые мы используем, следующий:
[dependencies]
wgpu = "29.0.0"
winit = "0.30"
image = "0.24"
glam = "0.24"
noise = "0.8"
rapier3d = "0.32.0"
hecs = "0.10"
egui = "0.34"
egui-wgpu = "0.34"
egui-winit = "0.34"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
bincode = "2.0.1"
rayon = "1.8"
log = "0.4"
env_logger = "0.11"
tokio = { version = "1.0", features = ["full"] }
bytemuck = { version = "1.21", features = ["derive"] }
fern = "0.7.1"
chrono = "0.4.44"
rfd = "0.15"

Что это такое?
Этот проект Techpixel представляет собой воксельный 3Д-движок в формате игры Minecraft, причем очень много взято за основу именно из него - например, подчистую слизана система слоев с моими доработками, система биомов, цветов биомов.

Описание
Фичи, которые добавлены в своей базовой реализации:

0) Порядок проходов рендеринга - небо -> геометрия мира -> геометрия сущностей -> полупрозрачные блоки -> обводка блоков -> интерфейс.
Экраны - стековая Machine State: push() → load() → start() → (N вызовов) update()/render()/build_ui() → unload()
1) Структура.
структура:
src/
├── main.rs                          — Точка входа, event loop, App
├── core.rs                          — Модульные декларации ядра
├── screens.rs                       — Модульные декларации экранов
├── core/
│   ├── config.rs                    — Глобальные атомики конфигурации
│   ├── renderer.rs                  — wgpu surface/device/queue
│   ├── screen.rs                    — Screen trait + ScreenAction
│   ├── screen_manager.rs           — Стековая машина состояний
│   ├── input_controller.rs         — Обработка ввода
│   ├── logging.rs                   — Инициализация логгера (fern)
│   ├── frame_timing.rs             — Атомики тайминга кадра
│   ├── user_settings.rs            — Пользовательские настройки (JSON)
│   ├── save_system.rs              — Сохранение/загрузка миров
│   ├── raycast.rs                   — DDA воксельный рейкаст
│   ├── physics.rs                   — rapier3d обёртка
│   ├── player.rs                    — Контроллер игрока
│   ├── player_model.rs             — Парсер сущностей Bedrock geometry
│   ├── block_model.rs              — Унифицированный парсер моделей
│   ├── model_messenger.rs          — Асинхронная загрузка моделей
│   ├── entity.rs                    — Система сущностей
│   ├── upload_worker.rs            — Фоновый поток упаковки мешей
│   ├── egui_manager.rs             — egui интеграция
│   ├── egui_fonts.rs               — Шрифты egui
│   ├── egui_style.rs               — Стиль egui
│   ├── lighting_legacy.rs          — Цикл дня/ночи, конфиг освещения
│   ├── lighting/mod.rs             — Реэкспорт lighting_legacy
│   ├── gameobjects/
│   │   ├── block.rs                — BlockDefinition + BlockRegistry
│   │   ├── chunk.rs                — Chunk: воксельное хранилище + greedy mesh для лодов
│   │   └── texture_atlas.rs        — Атлас текстур
│   ├── world_gen/
│   │   ├── world.rs                — World + WorldWorker
│   │   ├── pipeline.rs             — BiomePipeline
│   │   ├── geography.rs            — Континентальная карта высот
│   │   ├── climate.rs              — Климатические зоны
│   │   ├── geology.rs              — Геологические регионы (Voronoi)
│   │   ├── stratification.rs       — Стратиграфия колонок
│   │   ├── biome_layer.rs          — BiomeLayer trait
│   │   ├── biome_registry.rs       — BiomeDictionary
│   │   ├── nature.rs               — Деревья и растительность
│   │   └── layers/                 — Реализации слоёв (zoom, island, river, и т.д.)
│   ├── vct/
│   │   ├── system.rs               — VCTSystem: GPU ресурсы
│   │   ├── voxel_volume.rs         — VoxelSnapshot + упаковка
│   │   ├── dynamic_lights.rs       — Point/Spot/Shadow AABB GPU структуры
│   │   └── mod.rs
│   ├── radiance_cascades/          — легаси пока: не подключено к GameScreen
│   │   ├── system.rs, dispatch.rs, merge.rs, sampling.rs, types.rs, voxel_tex.rs
│   │   └── shaders/ (6 WGSL файлов)
│   ├── fluid/
│       └── mod.rs                  — FluidSimulator
├── screens/
│   ├── game_screen.rs              — Главный экран игры
│   ├── game_3d_pipeline.rs         — GPU пайплайн, камера, фрустум
│   ├── player_renderer.rs          — Скелетный рендеринг игрока
│   ├── entity_renderer.rs          — Рендерер сущностей
│   ├── block_model_renderer.rs     — Рендерер моделей блоков
│   ├── hand_block_renderer.rs      — Блок в руке
│   ├── sky_renderer.rs             — Небесный купол + спрайты
│   ├── inventory.rs                — Инвентарь + хотбар
│   ├── main_menu.rs                — Главное меню
│   ├── settings.rs                 — Экран настроек
│   ├── debug_overlay.rs            — F3-оверлей
│   ├── profiler_overlay.rs         — Профилировщик кадра
│   ├── gpu_info.rs                 — Информация о GPU
│   ├── worldgen_visualizer_screen.rs — Визуализатор генерации
│   └── worldgen_visualizer.rs      — Отрисовка биомов
└── shaders/
    ├── pbr_lighting.wgsl           — PBR без GI
    ├── pbr_vct.wgsl                — PBR + VCT GI
    ├── vct_inject.wgsl             — VCT инжекция (compute shader)
    ├── vct_propagate.wgsl          — VCT распространение (compute shader)
    ├── water.wgsl                  — Вода
    ├── player_model.wgsl           — Модель игрока
    ├── entity_pbr.wgsl             — PBR для сущностей + VCT
    ├── outline.wgsl                — Wireframe выделения
    ├── debug_lines.wgsl            — Линии отладки
    ├── wireframe.wgsl              — Wireframe мешей

2) Полная отладочная информация о всех процессах в рантайме по F3 (дебаг) и F4 (профилировщик). Здесь видно что проц постоянно ждет видеокарту. Непорядок! Но я пока не разобрался из-за чего - видеокарта явно не загружена на максимум. Может у кого получится разобраться? А то чет 142-162 фпс для пиксельной игры как то маловато.
1778884408664.png

3) Две нормальных системы глобального освещения (GI) на основе VCT (основная) и Radiance Cascades (пока отключена, там с ней проблемы были, уже не помню какие, надо разбираться). + DDA voxel raycast для теней и не flood-fill источников света (по сути две системы освещения в одной упаковке). Цветные источники света, большой радиус освещения, возможности динамического освещения (например, источник света на сущности). Отдельный проход для полупрозрачного рендеринга - с возможностью частичного затенения и цветных теней (через блок красного стекла свет окрасится в красный, а на солнце тень от этого блока тоже будет красноватой. Волюметрические лучи и эмбиент гало вокруг источника света также доступны.
Рейтрейс-тени по геометрии (от моделек в том числе) (пока не очень хорошо работают для моделей)
1778885941406.png

Прожектор - направленный источник света
1778886914293.png

Тестовый omni light на сущности - если бы этот клон стива мог ходить, свет бы считался в реалтайме
1778887412238.png

Полупрозрачность и адаптивное поглощение света. Блок стекла поглощает всего около 10% и поэтому дает такую блеклую тень, в отличии от базальта, который рисует полную тень.
1778888985142.png

Цветное стекло - дает цветную тень.
1778889032105.png

Flood-fill освещение, как оригинальном майнкрафте. Только большего радиуса и цветное также.
1778886704693.png
1778886738589.png

4) Полностью user-friendly гибкая система на основе json конфигов. Настроить можно буквально почти все, вплоть до размера чанков.
5) Бесконечная вертикальность мира - после достижения нижней высоты, указанной в конфиге, генерируется новый слой мира. Копать под землю можно бесконечно, строить в высоту - бесконечно. Производительности ради активен может быть только один слой мира и физика тоже распространяется только на дефолтный. Думаю если развить и доработать идею, можно будет сделать бесшовные переходы между мирами - добавить какой нибудь подземный мир или космос.
6) Оптимизация - фрустум куллинг по чанкам и по геометрии, многопоточность загрузки и выгрузки чанков, приоритетная прорисовка чанков в направлении камеры, 3 уровня LOD (настраиваемо) чанков,
7) Полный биомный пайплайн генерации ландшафта на основе слоев с геологически корректными регионами и цветами биомов (тинт для окраски, указывается в конфиге блока, расширяем)
  • Географический слой - материки, острова, горы
  • Климатический слой - чередование климатических зон по оси Z, влажность
  • Геологический слой - три региона - магматический, метаморфический, осадочный. Внутри себя подразделяются на более специфичные подрегионы.
  • Пластовый слой - чанк состоит из слоев трава-земля-глина-твердая глина-камень-базовая порода
  • Слой биомов с подвариантами - океаны, пляжи, равнины, горы, болота, пустыни, джунгли, тундры, рек
  • Природный слой (в дополнение к биомам) - биомы растительности отдельно. Специально для удобства работы - можно сделать живой лес как у @Liahim в туманном. Почему бы и нет :)
Основная фишка - интегрированный в движок визуализатор с возможностью детальной настройки каждого параметра. Больше не надо лазить в json и руками там что исправлять - все в реальном времени отображается и конфигурируется. После настройки нажимается кнопка Save to JSON - и вперед, покорять свой индивидуальный мир.
1778880302875.png
1778885625498.png
1778885660322.png
1778885741511.png
1778885697765.png

8) Json - ориентированная система блоков. Аналогично редактору генератора мира можно добавлять и настраивать новые блоки прямо в игре в Block Editor. Параметров для настройки уйма - возможности для настроек типов, PBR материала, эмиссии света (тот самый flood-fill), удобная настройка текстуры для каждой грани + до пяти слоев семплирования (на первом скриншоте блок земли, на который через первый слой семплируется только трава с прозрачными пикселями как отдельная текстура). Причем это не фейковая геометрия поверх обычного блока, а настоящий сплаттинг текстур.

1778885427655.png
1778884876939.png
1778885532499.png
1778884724183.png
1778884756677.png

9) Физика на основе rapier3d. Ею почти не занимался, самый базовый вариант коллизии блоков с сущностями + гравитация.
1778888606827.png
10) Базовый алгоритм воды на основе клеточных автоматов. Пока что в зачаточном состоянии тоже, как и физика.
1778888760862.png
11) Система загрузки json моделей блоков майнкрафта форматов Bedrock (геометрия с разверткой) и Java Edition (до 1.21.5 версия, дальше там они такую же бедроковскую воткнули в игру, как я понял). По ключам minecraft:geometry или elements/faces движок сам понимает какого типа модель и применят соответсвующий парсер.
12) Система сохранения и загрузки мира и сущностей.
1778890608907.png
1778890636051.png
13) Всякие глобальные настройки. Не все работают :)
1778890711629.png

14) Трехурровневое логгирование (IS_DEBUG, IS_FLOW_DEBUG, IS_EXT_DEBUG) почти всего в формате [Class][Method] — message
14) Сетевая игра - либа подключена, реализация не сделана.
 

Вложения

  • 1778884810983.png
    1778884810983.png
    642.4 KB · Просмотры: 13
p.s
Если вдруг движок обретет много последователей, возможно имеет смысл вынести тему в отдельный раздел. Типа, будет такой общефорумный движковый проект, где каждый юзер форума сможет внести свою лепту :)
 
Здесь видно что проц постоянно ждет видеокарту. Непорядок! Но я пока не разобрался из-за чего - видеокарта явно не загружена на максимум. Может у кого получится разобраться? А то чет 142-162 фпс для пиксельной игры как то маловато.
Occlusion query подключал? Если пытаешься сразу взять результат, то процессор будет ждать, пока видеокарта отрисует геометрию и вернет результат occlusion query
 
Я не знал про такой подход. Я погуглил, я так понимаю это типа отложенное получение результата? Типа процессор получает результат не в том же кадре, а в следующем?

В целом я провел некоторые тесты, ну это львиную часть вычислений жрет GI VCT. Если его выключать, то 500-600 фпс легчайше. Но освещение конечно совсем не торт становится :)
Короче значит все нормально, лучше тут не сделать. Надо будет попробовать Radiance Cascades воткнуть все таки и еще какие нибудь системы. Пусть выбор будет)
 
Последнее редактирование:
GI VCT - это что?
Да, отложенное получение результата, потому что видеокарта рисует не сразу, как процессор отправил команду отрисовать some thing
upd: понял, это глобал иллюминейшн
Но это я еще не ковырял, не подскажу

Еще у тебя проблема с освещением. Я так понимаю, ты в шейдере для точечного источника освещения делаешь аля:

C-like:
vec4 baseColor = texture2D(texSampler, uv);
// ... some spot light calculations
vec3 spotLightBrightnesss = ...;
vec3 finalColor = baseColor.rgb + spotLightBrigtness
// где то тут клампишь значение между 0 и 1 для финального цвета
// и задаешь значение для out vec4, чтобы видеокарта окрасила пиксель

Так не стоит делать. При ярком освещении теряются текстуры блока
 
Последнее редактирование:
voxel cone tracing, один из алгоритмов глобального освещения
Так не стоит делать. При ярком освещении теряются текстуры блока
Спасибо, поправлю на досуге. Можешь пулл-реквест сделать)
 
Не бро, мне щас своих проблем с мультитред отрисовкой мира хватает, и с вонючим карпентером, который это ярым образом отвергает
 
Добавил сегодня еще настройки освещения короче в итоге. Теперь в движке есть 5 видов освещения. Обычное flood-fill монохромное как в майнкрафте на 16 блоков, монохромное но на 32 блока, цветное на 32 блока и полноценное с переотражениями GI. На обычном монохромном 16 блочном с выключенными патчтрейсами можно выжать 800 фпс (проверил на своем железе asus tuf gaming a15). С DDA 300-350, зависит от качества. Ну и соответсвенно, эти же настройки чекает и block editor, так что настройка не сломается. Думаю на этом с освещением я закончу, хочется уже занятся физикой воды и блоков)

1778971161561.png
 
Главное условие - код пишет только нейронка. Самим нельзя :)
Actually, это забавный челенж. Сам участвовать я конечно не буду, но читать об этом довольно интересно 👍
 
Actually, это забавный челенж. Сам участвовать я конечно не буду, но читать об этом довольно интересно 👍
А почему нет? Нужно две тыщи на подписку и свободный вечер после тяжелого трудового дня)
клоду щас еще лимиты подняли, ваще комфортно стало
 
Это где щас такие цены на клод?
Обычная про подписка, это max подписка 8к стоит. С зарубежной карты я плачу по обычному курсу примерно 1700-1800 выходит. Раньше через МТС оплату еще платил, там чуть дороже с наценкой примерно 2500-2600, но зато прямо через сбп можно
 
Хз, у меня гемини про на полтора года за 450 рублей
месяц полторашку отдавать, или даже больше чет жаба душит
 
Доделал динамический свет. Теперь у стива на L включается фонарик с рейтресингом
Безымянный.png
 
И сразу же вдогонку - запилил и редактор внутри движка для удобной настройки света на сущностях. Можно добавлять разные источники, направленные или омнилайты, а также настраивать яркость, цвет и интенсивность света. Для направленного источника света есть еще параметры направления вектора света и фокус (конус пучка света)

1779114501350.png
 
Какая нахрен нейрошифровка
У тя выше именование слайдера идет впереди, а тут в конце
Зачем?
 
Назад
Сверху