Pull to refresh
0
0
Дмитрий Зеленев @ViX_EL

Программист

Send message

Собираем 8-битный компьютер

Reading time16 min
Views49K

Привет! Я всегда хотел собрать свой компьютер — не только в теории понять как «бегают» биты, складываются числа, работают прерывания, как программный код превращается в нули и единицы. У меня получилось и я хотел бы поделиться своим опытом. Это заняло у меня 140 часов и $400 на все компоненты и их доставку. Если вам интересно узнать о проекте, спускайтесь под кат.

Читать далее

learnopengl. Урок 1.1 — OpenGL

Reading time7 min
Views356K
Здравствуйте. Несколько недель назад я начинал серию переводов статей по изучению OpenGL. Но на 4 статье один хабровчанин заметил, что мои переводы могут нарушать лицензию, по которой распространяются учебные материалы, предоставленные в исходной статье. И действительно, мои переводы нарушали лицензию. Для разрешения этой проблемы я обратился к авторам того набора уроков, но так и не смог добиться нормального ответа. По этой причине я связался с автором другого, не менее (а возможно даже и более) крутого, набора уроков по OpenGL: Joey de Vries. И он дал полное разрешение на перевод его набора уроков. Его уроки гораздо более обширные, чем прошлый набор, поэтому эти переводы растянутся на долго. И я обещаю, будет интересно. Заинтересовавшихся прошу под кат.

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

На счет уроков по Vulkan: к сожалению мне тяжело сейчас написать уроки по данному API по причине скудной видеокарты на данный момент, которая просто не поддерживает Vulkan API, поэтому уроки по данному API будут только после обновления видеокарты.
Читать дальше →

Суперсовременный OpenGL. Часть 2

Reading time7 min
Views20K


Всем хорошего настроения и температуры за окном пониже. Как и обещал, публикую продолжение статьи по супер-пупер современному OpenGL. Кто не читал первую часть — Суперсовременный OpenGL. Часть 1.

Возможно повезет и я смогу весь оставшийся материал впихнуть в эту статью, это не точно…
Читать дальше →

Деревья квадрантов и распознавание коллизий

Reading time13 min
Views29K
image

Эта неделя была короткой, в понедельник и вторник я продолжал работать над системой 2D-освещения. Остальное время я потратил на реализацию деревьев квадрантов (quadtree).

В этой статье я поделюсь своей реализацией и мыслями, возникшими в процессе её проектирования.

Во-первых, мне нужно сказать, почему я решил реализовать дерево квадрантов.

Quadtree — это структура данных разбиения пространства. Её основное преимущество по сравнению с другими структурами данных заключается в адаптивности. Оно обеспечивает хорошую производительность при вставке, удалении и поиске. То есть мы можем использовать это дерево в динамическом контексте, где данные часто меняются. Более того, эту структуру довольно легко понять и реализовать.

Если разбиение пространства для вас новая тема, то рекомендую прочитать эту статью Роберта Нистрома. Если вы хотите более подробно узнать о деревьях квадрантов, то прочитайте эту или эту статьи.
Читать дальше →

Платформа с web-камерой на ESP32

Reading time16 min
Views47K
Идея собрать мобильную платформу с web-камерой на борту появилась практически спонтанно. Мне хотелось иметь в арсенале скромной домашней автоматизации что-то вроде IP-камеры. И тут вопрос не столь в цене или качестве, сколь в своеобразном творческом эксперименте. Материалом для вдохновения были различные статьи DIY и проекты вроде этого.

image
Читать дальше →

Основы стереозрения

Reading time10 min
Views121K
В данной статье содержатся базовые сведения о математическом аппарате, используемом в стерео зрении. Идея ее написания появилась после того как я начал работать с методами стерео зрения, в частности использовать алгоритмы реализованные в OpenCV. Эти алгоритмы зачастую ссылаются на различные понятия, такие как "фундаментальная матрица", "эпиполярная геометрия", "триангуляция". Существуют очень хорошие книжки по компьютерному зрению, в которых описывается, в том числе и стерео зрение и все необходимые понятия, но в них, нередко, бывает представлено слишком много информации для новичка. Здесь же, в краткой форме изложены базовые сведения о том, как работает стерео зрение и основные связанные с ним необходимые понятия:
  • проективная геометрия и однородные координаты
  • модель камеры
  • эпиполярная геометрия (epiporal geomerty), фундаментальная и существенная матрицы (fundamental matrix, essential matrix)
  • триангуляция стереопары точек
  • карта глубины(depth map), карта смещений(disparity map) и идея, лежащая в основе ее вычисления
Практически весь материал статьи основан на книге "Multiple View Geometry in Computer Vision" by Hartley, R. I. and Zisserman, A., а раздел про построение карты глубины описан на основе материала из "Learning OpenCV" by Gary Bradski, Adrian Kaehler.

Для понимания содержимого статьи достаточно иметь общее представление об аналитической геометрии и линейной алгебре: знать, что такое матрица, вектор, скалярное и векторное произведение.

Читать дальше →

Шейдеры 3D-игр для начинающих: эффекты

Reading time18 min
Views15K
[Первая часть]

Разобравшись с основами, в этой части статьи мы реализуем такие эффекты, как контуры объектов, bloom, SSAO, размытие, глубина резкости, пикселизация и другие.

Контуры



Создание контуров вокруг геометрии сцены придаёт игре уникальный внешний вид, напоминающий комиксы или мультфильмы.

Diffuse материала


Шейдеру контура необходима входящая текстура для распознавания и раскраски краёв. Кандидатами стать такой входящей текстурой могут быть диффузный цвет из материалов, цвета из диффузных текстур, нормали вершин или даже цвета из карт нормалей.

uniform struct
  { vec4 diffuse
  ;
  } p3d_Material;

out vec4 fragColor;

void main() {
  vec3 diffuseColor = p3d_Material.diffuse.rgb;
  fragColor = vec4(diffuseColor, 1);
}

Здесь показан небольшой фрагментный шейдер, который рендерит диффузный цвет материала геометрии в текстуру буфера кадров. Эта текстура диффузного цвета из буфера кадров будет входящей текстурой для шейдера контуров.
Читать дальше →

Домашний DPI, или как бороться с провайдером его же методами

Reading time16 min
Views308K

Долгое время я терпел ограничения РосКомНадзора и соответствующие действия провайдеров по различным ограничениям доступа к сайтам - но с определённого момента устал, и начал думать как бы сделать так, чтобы было и удобно, и быстро, и при этом с минимумом заморочек после настройки... Хочу оговориться, что цель анонимизации не ставилась.

Вообще, эта проблема имеет несколько решений... Но я решил бороться с провайдером их же методом.

...При помощи NGINX!

Ликбез по типизации в языках программирования

Reading time12 min
Views533K
image

Эта статья содержит необходимый минимум тех вещей, которые просто необходимо знать о типизации, чтобы не называть динамическую типизацию злом, Lisp — бестиповым языком, а C — языком со строгой типизацией.

В полной версии находится подробное описание всех видов типизации, приправленное примерами кода, ссылками на популярные языки программирования и показательными картинками.
Читать дальше →

Алгоритм «diamond-square» для построения фрактальных ландшафтов

Reading time12 min
Views119K
Карта игры Minecraft, созданная с помощью приложения CartographДумаю, многие знакомы с весьма необычной игрой Minecraft (справа — пример сгенерированной в ней карты), в которой игрок находится на (практически) бесконечной поверхности Земли и может исследовать окружающий мир с минимальными ограничениями.

Как же автору игры, Notch'у, удалось добиться подобного сходства его случайных «миров» с земными просторами? В этом топике я как раз и рассмотрю один из способов построить искусственный ландшафт такого рода (и вскользь упомяну пару других способов), а также расскажу о моем небольшом усовершенствовании этого алгоритма, позволяющем значительно увеличивать размеры ландшафта без заметных потерь в производительности.

Внутри вас ждет несколько схем и красивых картинок, довольно много букв и ссылка на пример реализации алгоритма.

Читать дальше →

Генератор подземелий на основе узлов графа

Reading time11 min
Views29K
image

В этом посте я опишу алгоритм процедурной генерации уровней двухмерного подземелья с заранее заданной структурой. В первой части будет представлено общее описание, а во второй — реализация алгоритма.

Введение


Алгоритм был написан как часть работы на получение степени бакалавра и основан на статье Ma et al (2014). Целью работы было ускорение алгоритма и дополнение его новыми функциями. Я вполне доволен результатом, потому что мы сделали алгоритм достаточно быстрым, чтобы использовать его во время выполнения игры. После завершения бакалаврской работы мы решили превратить её в статью и отправить на конференцию Game-ON 2018.

Алгоритм


Для создания уровня игры алгоритм получает в качестве входных данных набор полигональных строительных блоков и граф связности уровня (топологию уровня). Узлы графа обозначают комнаты, а рёбра определяют связи между ними. Цель алгоритма — назначить каждому узлу графа форму и расположение комнаты таким образом, чтобы никакие две формы комнат не пересекались, и каждая пара соседних комнат могла соединяться дверьми.

Как работает рендеринг 3D-игр: освещение и тени

Reading time20 min
Views25K
Реализация подавляющего большинства визуальных эффектов в современных играх зависит от продуманного использования освещения и теней. Без них игры были бы скучными и безжизненными. В четвёртой части анализа рендеринга 3D-игр мы сосредоточимся на том, что происходит в 3D-мире наряду с обработкой вершин и наложением текстур. Нам снова понадобится много математики, а также уверенного понимания основ оптики.

Часть 1: обработка вершин

Часть 2: растеризация и трассировка лучей

Часть 3: текстурирование и фильтрация текстур

Вспомним пройденное


Ранее мы рассматривали ключевые аспекты перемещения и обработки объектов в сценах, их преобразования из трёхмерного пространства в плоскую сетку пикселей, а также способы наложения текстур на эти объекты. В течение многих лет такие операции составляли основную часть процесса рендеринга, и мы можем увидеть это, вернувшись в 1993 год и запустив Doom компании id Software.


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

Теней не было, потому что они не входили в задачу программистов: PC того времени представлял собой процессор на 66 МГц (то есть на 0,066 ГГц!), жёсткий диск на 40 МБ и 512-килобайтную графическую карту с минимальными 3D-возможностями. Перенесёмся на 23 вперёд: в знаменитой перезагрузке серии мы видим совершенно другую историю.


Для рендеринга этого кадра использовалось множество технологий, он может похвастаться такими этапами, как screen space ambient occlusion, pre-pass depth mapping, фильтры размытия боке, операторы тональной коррекции, и так далее. Расчёт освещения и затенения каждой поверхности выполняется динамически: они постоянно изменяются в зависимости от условий окружающей среды и действий игрока.

Пишем простой Path Tracer на старом добром GLSL

Reading time18 min
Views19K

На волне ажиотажа вокруг новых карточек от Nvidia с поддержкой RTX, я, сканируя хабр в поисках интересных статей, с удивлением обнаружил, что такая тема, как трассировка путей, здесь практически не освящена. "Так дело не пойдет" - сказал я и решил, что неплохо бы запилить что-нибудь небольшое из этой темы, да и так, чтобы другим полезно было. Тут как кстати API собственного движка нужно было протестировать, поэтому решил - запилю-ка я свой простенький path-tracer прямо во фрагментном шейдере. Что из этого вышло, думаю вы уже догадались по превью к этой статье

Читать далее

Пишем программу 3D-моделирования в 500 строках кода

Reading time28 min
Views26K
image

Введение


Люди от природы креативны. Мы постоянно проектируем и создаём новые, полезные и интересные вещи. Сегодня мы пишем ПО, помогающее процессу проектирования и творчества. Программы САПР (Computer-aided design, CAD) позволяют творцам проектировать здания, мосты, графику видеоигр, чудовищ для фильмов, объектов для 3D-печати и множество других вещей перед созданием физической версии проекта.

По своей сути, инструменты CAD являются способом абстрагирования трёхмерного проекта в нечто, что можно просматривать и редактировать на двухмерном экране. Чтобы справляться со своей задачей, инструменты CAD должны обеспечивать три основных элемента функциональности. Во-первых, они должны иметь структуру данных, описывающую проектируемый объект: это то, как компьютер понимает создаваемый пользователем трёхмерный мир. Во-вторых, инструмент CAD должен обеспечивать отображение проекта на экране пользователя. Пользователь проектирует физический объект с тремя измерениями, но экран компьютера имеет всего два измерения. Инструмент CAD должен моделировать способ восприятия нами объектов и отрисовывать их на экране так, чтобы пользователь смог понять все три измерения объекта. В-третьих, CAD должен предоставлять возможность взаимодействия с проектируемым объектом. Пользователь должен быть способен дополнять или модифицировать проект, чтобы создать нужный результат. Кроме того, все инструменты должны иметь возможность сохранения и загрузки проектов с диска, чтобы пользователи могли сотрудничать, обмениваться своей работой и сохранять её.
Читать дальше →

Трехмерный движок в коде… ДНК

Reading time40 min
Views23K
UPD 29 ноября: Репозиторий с кодом ДНК выложен на GitHub.
github.com/pallada-92/dna-3d-engine

UPD 30 ноября:
В англоязычном твиттере заметили проект
Новость попала в топ-10 на HackerNews!






Меня всегда интересовало, на что может быть похоже программирование внутриклеточных процессов. Как выглядят переменные, условия и циклы? Как вообще можно управлять молекулами, которые просто свободно перемещаются в цитоплазме?

Ответ довольно неожиданный — lingua franca для моделирования сложных процессов в клетках является реакции вида
Эти реакции моделируются при помощи закона действующих масс, который одинаково работает и в химии, и в молекулярной биологии.

— Неужели при помощи этих примитивных реакций можно что-то программировать?
— Да, а то, что написано выше, вычисляет $B = \sqrt{A}$.

В этом пошаговом туториале мы вместе взорвем себе мозг, чтобы получить 10 таких реакций, которые производят рендер трехмерного куба.

Потом я расскажу, как полученные реакции скомпилировать в код ДНК, который можно синтезировать в лаборатории и (если очень повезет) получить трехмерный куб из двумерного массива пробирок.

Как обычно, я сделал веб-приложение с эмулятором таких реакций, в котором можно поупражняться в «реактивном» программировании. Вы сможете удивлять химиков способностью вычисления конечных концентраций в сложных системах реакций методом пристального взгляда.

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

Использование алгоритма Прима для генерации соединённых друг с другом пещер

Reading time4 min
Views14K


Я решил объяснить один из алгоритмов генерации карты, используемых в моей игре In the House of Silence. Главное преимущество этого способа заключается в том, что в отличие от других алгоритмов, он никаким образом не может сгенерировать карту с разделёнными частями.

Генерация идеального лабиринта



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

Для понятности я привёл псевдокод, описывающий алгоритм Прима. Будет довольно просто приспособить его под любой язык программирования.
Читать дальше →

Процедурная генерация деревьев методом транспорта питательных веществ

Reading time11 min
Views12K

Примечание: код для этой статьи выложен на мой Github [здесь].

Я провёл всё лето в восточной Пенсильвании рядом с рекой Делавер, потому что кампус MIT в начале марта закрыли и мне пришлось поехать домой. Время от времени прогуливаясь рядом с домом или работой, я заходил в леса, и однажды подметил простой принцип:

Когда любая ветвь дерева разделяется, сумма площадей поперечного сечения сохраняется.

Это наблюдение уже было сделано да Винчи. Я решил воспользоваться этим наблюдением, соединить его с транспортно-ориентированной интерпретацией естественного роста деревьев, создать простую модель и нагенерировать в ней деревьев.

В данной статье будет описана эта модель и способ её использования для генерации реалистично выглядящих деревьев с разной морфологией.

При помощи этой методики можно генерировать высококачественные меши деревьев на разных этапах роста в реальном времени и с незначительной тратой вычислительных ресурсов!

Что нужно для создания хорошего подземелья в RPG?

Reading time12 min
Views15K
image

Для начала нужно ответить на вопрос что же такое подземелье?

Не буду углубляться в эту тему, а просто использую определение из третьего издания руководства мастера подземелий (ДМ) D&D:

Понятие «подземелье» очень расплывчато. Подземелье обычно находится под землёй, но могут существовать и надземные «подземелья». Некоторые ДМ называют подземельями любые места, где происходит приключение. Здесь мы будем называть подземельем замкнутое, чётко заданное пространство, состоящее из соединённых определённым образом мест встреч с врагами.

Такое определение мне нравится, оно очень хорошо подходит как для настольных, так и для компьютерных RPG (которые я в дальнейшем буду называть CRPG). Но что же такое хорошее подземелье?

Это может показаться очевидным, но хорошее подземелье в CRPG должно соответствовать игре. Например, мне нравятся огромные переплетённые спагетти-подземелья из Daggerfall:


Они соответствуют игре, потому что в Daggerfall игрок движется быстро, есть такие способы перемещения, как полёты, взбирание, плавание и телепортация (слава богу, что есть телепорты), а встречи с врагами редки и скоро заканчиваются. Благодаря камере с видом от первого лица движение кажется очень удобным, в классическом стиле Doom.

Если бы такой дизайн использовали в Final Fantasy IX с её медленным движением, медленными пошаговыми боями, постоянными случайными врагами и фиксированной камерой, то это было бы невыносимо. То же самое относится к играм, где движение привязано к сетке карты, например, к Legend of Grimrock, или где перемещается большая группа персонажей, например, к Baldur’s Gate.
Читать дальше →

Симуляция эрозии рельефа на основе частиц

Reading time6 min
Views6.1K

Примечание: полный исходный код проекта, а также пояснения о его использовании и чтении можно найти на Github [здесь].

Я сделал перерыв в своей работе над магистерской диссертацией, чтобы потрудиться над тем, что уже давно откладывал: улучшенной генерацией рельефа для моего проекта Territory. Простым способом её реализации является гидравлическая эрозия, поэтому её я и создал!

Для программной задачки на один день она сработала довольно неплохо, и оказалась не такой сложной, как я ожидал. Результаты быстро генерируются, имеют физическое значение и потрясающе выглядят.

В этой статье я расскажу о моей простой реализации на C++ системы гидравлической эрозии в квадратной сетке на основе частиц. Я объясню все физические обоснования, заложенные в основу реализации, и расскажу о математике. Код чрезвычайно прост (всего примерно 20 строк на математику эрозии) и быстр в реализации, поэтому я рекомендую его всем, кто стремится повысить реализм своего рельефа.

Результаты рендерятся при помощи урезанной версии моего движка Homebrew OpenGl Engine, который я модифицировал для рендеринга 2D-массива точек в качестве карты высот. Урезанную версию движка намного проще понять, если вас интересует изучение OpenGL на C++.
Читать дальше →

Симуляция гидравлической эрозии

Reading time7 min
Views4.3K

Гидравлическая эрозия — это процесс постепенного преображения водой рельеф. В основном она вызывается осадками, но на неё также влияют разбивающиеся о побережье волны океана, а также течения рек. На рисунке 1 показаны масштабные эффекты, которые может оказать небольшой поток на окружающие его скалы. При создании реалистичных окружений необходимо учитывать влияние эрозии. Я уже экспериментировал с процедурной генерацией при создании сцен для послойного рендеринга вокселей и для демонстрации кубического шума. Такие рельефы очень просты и в них не учитывается влияние эрозии. Следовательно, им не хватает деталей, из-за чего они при близком рассмотрении кажутся нереалистичными.


Рисунок 1: небольшой водопад.

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

Information

Rating
Does not participate
Location
Кингисепп, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity