Войти

Программирование игр

Игровой движок, 3D графика, сеть, физика, логика, уеб

НовостиСтатьиПодсказкиТерминыFAQФорумИнфо

Статьи

Имитация раскачивания дерева под воздействием ветра
Имитация раскачивания дерева под воздействием ветра
Статья демонстрирует простой метод имитации воздействия ветра на дерево (куст), реализованный на вертексном шейдере.

Читать | Комментарии [19]
9 окт. 2020

Освещение с использованием фотометрического профиля
Освещение с использованием фотометрического профиля
Фотометрический профиль (ФП) описывает распределение интенсивности света точечного источника, полученные с помощью соответствующего измерительного оборудования. Используя данные ФП можно добиться эффекта симуляции сложных теней и нестандартного затухания света.

Читать | Комментарии [25]
3 июня 2020

Гидродинамика Шрёдингера на пальцах
Предрасчёт рейкаста для эффективного рендеринга травы и меха
На пути к эффективному алгоритму Global Illumination, часть 1
Синхронизации в Vulkan

Термины

Universal Scene Description (USD)
Universal Scene Description (USD)
Universal Scene Description (USD) — файловый формат описания трехмерной сцены, разработанный компанией Pixar.

Читать
5 июня 2018

Verge3D
Verge3D
Verge3D - трёхмерный движок для веба, использующий технологию WebGL. Основан на Three.js, от которого отличается наличием реалистичных материалов, визуальным редактором логики Puzzles, средой создания приложений и более тесной интеграцией с программами моделирования Blender и 3ds Max. 14 декабря 2017 года в рамках проекта был запущен облачный сервис Verge3D Network для публикации и распространения 3D-приложений.

Читать | Комментарии [19]
8 дек. 2017

Вуду-программирование
Blend4Web
Forward+

Подсказки

MAX Script: Разделение 3D модели на элементы по группам нормаль векторов.
MAX Script: Разделение 3D модели на элементы по группам нормаль векторов.
Здесь представлен скрипт 3D Studio MAX, при помощи которого можно разделить 3D модели на элементы по группам нормалей, также смотрите «MAX Script: Разделение 3D модели на элементы по группам сглаживания».

Читать
10 мая 2020

Delphi: Точный таймер (Win API)
^ Матрица LookAt
Инверсия матрицы 4x4

Новости

Развитие рендера в Path of Exile
Выложили мой доклад с exilecon. В нём я рассказываю о нескольких необычных техниках рендеринга, разработанных для Path of Exile. Доклад на английском языке. Есть русские субтитры.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Ссылка | Комментарии [69]
8 апр. 2020

Ray Tracing Gem. Доступно бесплатно!
Опубликована PDF-книга «Ray Tracing Gem. High-quality and real-time rendering with DXR and other APIs» на 600+ страниц, подготовленная NVIDIA и разными специалистами из области рейтрейсинга. Можно скачать отсюда:
https://link.springer.com/book/10.1007/978-1-4842-4427-2

Ссылка | Комментарии [7]
4 мар. 2019

Microsoft анонсировала DirectX Raytracing (DXR)
На проходящей в Сан-Франциско конференции разработчиков игр (GDC) компания Microsoft анонсировала поддержку в DirectX 12 технологии DirectX Raytracing (DXR). Новый программный интерфейс позволяет производить просчет рейтрейсинга при помощи поддержки этой технологии в железе.

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

SEED-screenshot | Microsoft анонсировала DirectX Raytracing (DXR)

Подробнее…

Ссылка | Комментарии [504]
20 мар. 2018

О дизайне игровых подсистем в 2048 Tournament
Опубликован доклад по итогам разработки игры 2048 Tournament. В нём секции о естественной и искусственной сложности, о принципах дизайна систем, о типах ошибок, о декларативном формировании сценария действий, о том, как у нас работает конечный автомат и о паре архитектурных трюков.

P.S. Не забудьте включить полноэкранный режим просмотра.
Ссылка на доклад: http://www.goo.gl/6DoH7R

2048_tournament_postmortem | О дизайне игровых подсистем в 2048 Tournament

Ссылка
27 янв. 2015

Форум

угол между рёбрами треугольника и рёбрами текстурной развертки28 ноя. 202120:56g-cont
Реально его найти вообще? Задача в следующем:

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

  vec3  vedge0 = v0 - v1;
  vec3  vedge1 = v2 - v1;
  vec2  tedge0 = t0 - t1;
  vec2  tedge1 = t2 - t1;
  vec3  normal = cross( vedge0, vedge1 );
  vec2  sedge0, sedge1;
  mat3  local;
  float  x, y;

  local[0] = normalize( vedge0 );
  local[1] = normalize( vedge1 );
  local[2] = normalize( normal );
  sedge0 = vec2( normalize( vedge0 * local ));
  sedge1 = vec2( normalize( vedge1 * local ));
  x = dot( sedge0, tedge1 );
  y = dot( sedge1, tedge0 );
  double angle = atan2( y, x );
Я вот что-то такое набросал, но я толком не умею работать с текстурным пространством. Может там рёбра как-то иначе считать надо?
Причём, если для текстурных ребёр мы можем предположить строгую перпендикулярность, то для рёбер треугольника - уже нет.
Есть может какой-нибудь пейпер или рабочий пример?
Странное поведение glDrawElements на ATI26 ноя. 202117:30The Andreyp
Привет

непонятная фигня. на НВ все ок.

на ати - рисую много трисов за кадр ( по ходу дела ряд вызовов glDrawElements ).
в одном из вызовов рисую террайн одним вызовом glDrawElements  (индексов думаю сотни тысяч)

после чего все зависает и валится в совсем чорний экран
так же возможно, что следующий меш не рисуется после того как нарисовал дофига

замечал такое на старой ати и на новой веге.

никто не сталкивался с таким поведением???????

убираю отрисовку террайна и все становится ок

Правка: 17:31

Forward vs Deferred25 ноя. 202110:31Alerr
Привет всем!
Нужно поддерживать Stencil. С Deferred камерой это проблемно.
Есть такой вопрос : если в игре один источник света (directional light с эффектом volumetric light), то имеет ли  этом случае смысл использовать Deferred render path?
Я не профи, на мой взгляд directional дает выигрыш в случае 2-х и более источников света.
Подскажите, я прав?
Небоскрёб с 65000+ этажами23 ноя. 202122:47MSA2
Всем привет!

Возникла безумная идея ввести в игру небоскрёб, обладающий множеством этажей. Например, 2 в 16 степени = 65536 этажами. Но можно и не так масштабно, хотя 256 маловато) Понятно, что моделировать такого монстра целиком нет смысла, тем более во вселенной моей игры видимость не превышает нескольких метров - это фундаментальное концептуальное ограничение.

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

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

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

Есть какие-то известные решения для таких задач? Или не стоит и замарачиваться этажами, на которые Игрок захочет "пойти глянуть", и просто ограничиться решением Игроком задачи с поиском номера нужного этажа?

Заранее спасибо!

Карта препятствий для звука23 ноя. 202122:25MSA2
Всем привет!

Обдумывая как сделать звук окружающих предметов и объектов немного правдоподобней, пришёл к необходимости некоего алгоритма, либо "карты препятствий", которые бы влияли на источник звука соответствующим образом. Например, когда источник звука за стеной, он должен быть тихим и глухим. Или когда Игрок за углом, уровень звука должен падать. Ну и т.д.

Полной имитации реальной физики не требуется. Но различные препятствия должны бы влиять на источники.

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

Заранее спасибо!

Не могу подкючить к Zenject UniRx23 ноя. 202119:12Orcan
хотел  подключить UniRx вроде сделал как в описании
но почему то только ошибки появились закинул ассет UniRX  а Extenject  Все равно не видит
Изображение
Изображение
Ошибка
Assets/Plugins/Zenject/OptionalExtras/Signals/Internal/SignalDeclaration.cs(5,7): error CS0246: The type or namespace name 'UniRx' could not be found (are you missing a using directive or an assembly reference?)
Assets/Plugins/Zenject/OptionalExtras/Signals/Main/SignalBus.cs(6,7): error CS0246: The type or namespace name 'UniRx' could not be found (are you missing a using directive or an assembly reference?)

Правка: 19:14

Кратчайший отрезок, соединяющий скрещивающиеся прямые23 ноя. 202113:36Kirwer7245
Даны две скрещивающиеся прямые в пространстве. Кратчайшее расстояние между ними - это отрезок, соединяющий две прямые и перпендикулярный обоим прямым. Мне нужно найти координаты концов этого отрезка.
Изображение
См. только правую половину картинки: если мне известны уравнения прямых AB и CD, нужно узнать координаты точек M и N.

Я понимаю, что можно решить это в лоб - из двух уравнений прямых вывести функцию от двух переменных, которая для всякой пары точек на этих прямых ставит в соответствие расстояние между ними, потом продифференцировать эту функцию сначала по одной переменной, потом по другой, получившееся нечто приравнять к 0, решить уравнение, чтобы найти экстремум (он один по определению, за исключением случая параллельных прямых), затем корни уравнения подставить в исходные уравнения прямых и тем самым получить координаты. На деле там получается дикий треш с очень длинными формулами, вероятность что-нибудь забыть/перпутать в которых стремится к 100%. Есть ли у кого-нибудь готовая формула/алгоритм для этого?

Заранее благодарен.

Правка: 13:37

Импульс бейзд коллижен - как выровнить значения импульсов в одном манифолде22 ноя. 202117:49L1f
Когда мы итеративно решаем контакты импульсным методом, то для коробки на плоскости на ходятся 4 контакта.

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

В этот момент получается левая картинка - два диагональных импульса выталкивают объект, а два остальных только стабилизируют его.
Магнитуда этих импульсов критично различается. Эту проблему не решает даже смена очередности решения импульсов, т.к. при применении warstarting-а на новом шаге первоначально мы примеряем эти старые неравные импульсы.

imppulses | О дизайне игровых подсистем в 2048 Tournament

Хочется получать импульсы как на картинке справа. Либо уже после решения этим контактов вычислить новые величины импульсов - которые будут действоать как "пружины с нулевой длиной" - т.е. стремится быть одинаковыми.

Кто-то знает как такое можно решить?

Правка: 17:55

Не работает умножение кватернионов, почему?22 ноя. 202112:37MikeNew
Согласно нагугленому определению, умножение двух кватернионов дает такой же эффект как умножение двух матриц поворота.

Пробовал умножать двумя способами:
1. Просто через glm.
2. Вот так:

glm::quat math::quatsMul(glm::quat q1, glm::quat q2) {
  glm::quat q;
  q.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z;
  q.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y;
  q.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x;
  q.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w;
  return q;

  q = glm::cross()
}

- результат неправильный.

Делаю из этих же кватернионов матрицы средствами glm, умножаю матрицы - результат правильный.
Как правильно умножать кватернионы? В гугле нашел только вышеприведенный код.

Мистический баг в элементарном шейдере21 ноя. 202118:38Singleton
Наткнулся на странный глюк. Изначально проблему заметил при реймарчинге 3д текстуры, луч шагает не в том направлении, но не суть. Выкинул все лишнее и написал переделанный минимальный пример демонстрирущий проблему. Сори за корявые числа типа 0.05 и т д, но это тут не просто так, спростил как мог.
Суть проблемы: по логике rayPos и rayPos2 должны быть идентичны и значение z должно быть близко к 0.
Если написать DebugVal = rayPos2 то все так и есть и на выходе мы видим зеленый цвет;
Но если написать DebugVal = rayPos; то на выходе значение в z не верное(близко к -1), и мы видим красный.
Также баг изчезает(тоесть при DebugVal = rayPos мы видим зелененький как и положено) если:
1.
float3 viewDir = -normalize(camPos);
заменить на
float3 viewDir = normalize(-camPos);
2.
float3 camPos = float3(0.05, 0, -1);
заменить на
float3 camPos = float3(0, 0, -1);
4. если развернуть цикл через [unroll] или наоборот поставить [loop];

При этом баг "квантовый". При попытке отладить шейдер все считается коректно. Тоесть дизасм шейдера в рендердоке коректный и я вижу что на выход всегда идет правильное значение, но приетом в фреймбуфере я вижу ошибочное(красный).

Вулкан. GeForce RTX 3060. Компилирую через shaderc. оптимизации отключены.
Изначально думал что проблема в компиляторе, прикрутил dxc, и конкретно данный глюк действительно ушел, но появились другие аналогичные.
Ну и как я сказал выше, сгенеренный код выглядит коректно. Тоесть где-то явно какое-то UB, но я видимо слепой.
у кого-то есть идеи что происходит? Если что шейдер не требует на вход ничего, можно кинуть себе на любой обьект и посмотреть.

float4 MainPS(V2P psIn) : SV_Target
{
    float3 DebugVal = 0;
    float3 camPos = float3(0.05, 0, -1);
    float3 viewDir = -normalize(camPos);

    float3 rayPos = 0;
    float3 rayPos2 = 0;
    float dt = 0;
    
    for (int i = 0; i < 2; i++)
    {
        rayPos = float3(0, 0, -0.5) + viewDir * dt;

        if (i == 1)
        {
            rayPos2 = float3(0, 0, -0.5) + viewDir * dt;
            DebugVal = rayPos; //  rayPos2;
            break;
        }

        dt += 0.5;
    }
  
    if (DebugVal.z < -0.9)
    {
        DebugVal = float3(1, 0, 0); // WRONG! rayPos -> -1
    }
    else
    {
        DebugVal = float3(0, 1, 0); // RIGHT! rayPos2 -> 0
    }
    return float4(DebugVal, 1);
}
GlukFramebuffer | О дизайне игровых подсистем в 2048 Tournament
GlukShader | О дизайне игровых подсистем в 2048 Tournament

P.S. Как заметил MrShoor в описаниии была ошибка. Отредактировал. DebugVal.z ~0 - правильное, DebugVal.z ~-1 - не правильное.

Правка: 22 ноя. 2021 17:31

Купить выкидные ножи по ссылке: nozheman.club/vykidnyye-nozhi/ в интеренет-магазине Ножеман .