Войти

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

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

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

Статьи

Строковые идентификаторы в движке. string pools.

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

Читать | Комментарии [39]
8 ноя 2022

С++ корутины, начальный уровень

Coroutine (сопрограмма, корутина) - функция, выполнение которой можно явно прерываться методами языка программирования. В отличие от прерывания выполнения потока (thread), который реализован в ОС и происходит неявно и в любой момент. (wiki)

Читать | Комментарии [58]
7 ноя 2022

Recursive Tile-based architecture
Имитация раскачивания дерева под воздействием ветра
Освещение с использованием фотометрического профиля
Гидродинамика Шрёдингера на пальцах

Термины

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

Новости

Вышла книга 3D Graphics Rendering Cookbook

Вышла книга 3D Graphics Rendering Cookbook: A comprehensive guide to exploring rendering algorithms in modern OpenGL and Vulkan авторов Sergey Kosarevsky (_NetSurfer_) и Viktor Latypov (Vinil)
Подробнее…

Ссылка | Комментарии [50]
6 фев 2022

Развитие рендера в 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

Форум

[OpenGL] "Исправленный" эффект невидимости30 ноя 202321:07Grieferus

Однажды, кто-то выяснил, что эффект невидимости в Doom, на самом деле, багнутый, ибо, по задумке, не должен иметь слишком тёмных пятен. Данное видео демонстрирует исправление: https://youtu.be/sq8p7kyjlUo?si=QMIsOfaE32O5ZGR-

А теперь, внимание, вопрос. Как мне повторить такой "исправленный" эффект?
Шейдер, отвечающий за этот эффект в GZDoom:

vec4 ProcessTexel()
{
  vec2 texCoord = vTexCoord.st;
  vec4 basicColor = getTexel(texCoord);

  float texX = texCoord.x / 3.0 + 0.66;
  float texY = 0.34 - texCoord.y / 3.0;
  float vX = (texX/texY)*21.0;
  float vY = (texY/texX)*13.0;
  float test = mod(timer*2.0+(vX + vY), 0.5);

  basicColor.a = basicColor.a * test;
  basicColor.r = basicColor.g = basicColor.b = 0.0;
 
  return basicColor;
}

KeyHit vs KeyDown - прыжок в платформере27 ноя 20234:16mingw


Вроде бы казалось бы просто...

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

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

А что вы думаете по этому вопросу?

Вопрос по С++ concept26 ноя 202311:21Imaginary unit

Требуется подсказка от гуру C++.
Начал осваивать фичи С++17,20,23. В частности concept.

Допустим, есть такое:

template <typename T>
concept Renderable = requires(T t)
{
    t.Render();
};

Как теперь сделать нечто подобное:

class RenderQueue
{
public:
    void AddRenderable(Renderable auto *r)
    {
        m_renderables.push_back(r); ???
    }

private:
    std::vector<Renderable*> m_renderables; ???
};

Насколько я понимаю, придется внутри RenderQueue городить какие-то template-обертки над указателем на Renderable. Или как?

Умножение вектора нормали в пространстве камеры23 ноя 202318:36boolCount

Имею проблемы, но что-то не понимаю почему не получается исправить. помогите плиз)

Дано:
Меш мира, позиция и нормали хранятся в мировых координатах.
в каждом треугольнике все вершины имеют одинаковую нормаль(т.е. между треугольниками нормаль меняется. но не меняется для вершин каждого отдельно треугольника)
В вершинном шейдере считаются вершины так:

// VP = View * Projection;
// матрица модели пустая, т.к. координаты вершин уже в мировых

out_position = VP * vec4(in_position, 1.0);
out_normal  = normalize(vec4(VP * vec4(in_normal, 0.0)).xyz);

во фрагментном шейдере просто пишем в нормалмапу. всё просто.

в общем то всё работает хорошо. артефактов вроде как нет.
как видно, нормали мы храним во ViewSpace, не мировых.


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

но как видно, входные(и получается выходные) параметры нормалей отдельного треугольника будут одинаковые на всей площади экрана.
а я хочу хранить нормали в экранном пространстве.

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

Баги с освещением23 ноя 202314:49Definer

Подкиньте идею, как можно убрать мыло от Гаус размытия. Использую Deferred Shading.
Сначала рисуется освещение с тенями, потом я это размываю, а дальше это размытое накладывается на отрисованный мир. Но создается ощущение, будто не только тени размыты, а и все пиксели которые затрагивают освещение (но это не так). Пытался сделать размытие только пикселей теней, но не получилось:

Изображение удалено

А еще как пофиксить эту подсветку контура меша от света? Она есть даже без размытия

Изображение удалено

Правка: 14:51

metaballs / isoSurfaces marching cubes23 ноя 20230:01The Andreyp

Посмотрел тут на новый MK1 и на его кровь, и замутил базовую реализацию. Такое впч, что рендерится все в кубе 0 ... 1, где сфера с координатами 0.5 будет по центру.

Так вот непонятно как это юзать вообще. Как увеличить пространство куба? Когда я буду туда приделывать координаты из физики там вообще все в пространстве например -100 100 где получается центр в 0, и где радиус партикла допустим 10, а там походу вес (он же радиус) 0...1

Размер сфер метаболов можно увеличить только юзая модельматрицу scale..

Работа с Апишкой игры21 ноя 202322:46LorenzoH

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

Прошу вас Помочь с советом или с наставлениями.

есть АПИ: https://api.sunflower-land.com/visit/64343
из которой надо взять всю инфу, она отображается в реальном времени.
И на основе этой информации сделать вот это: https://sflinfo.tech/farm/64343

Цель текста: Помогите понять как из этой Апишки сделать что-то что можно понять обычному игроку.

Главная идея к чему я иду это бот в Телеге который оповещает в реал тайм когда урожай готов.

Ссылка на бота: https://t.me/sfl_notice_bot

Правка: 22:51

glBindAttribLocation и Intel21 ноя 202315:39g-cont

Вот с какой удивительной проблемой столкнулся. Есть большой VBO-меш уровня. В этом меше находится абсолютно вся геометрия.
Понятно, что на разных частях геометрии используются разные шейдеры, а сами эти шейдеры используют разных набор из входных атрибутов.
Где-то к примеру нормали не нужны, где-то даже текстурные координаты. Бакэнд проверяет каждый шейдер на предмет использования тех или иных атрибутов и создаёт некую общую таблицу использованных: для всех шейдеров, которые применяются на данном меше. Если какой-то атрибут не был
использован ни одним шейдером - он просто выбрасывается на этапе генерации VBO ради экономии видеопамяти.
И вот на Интелах начинается следующая чертовщина - несмотря на явное указание glBindAttribLocation, компилятор GLSL почему-то сам упорно нумерует атрибуты как ему хочется. Включить GL_ARB_explicit_attrib_location я не могу - железка слишком старая, не умеет в GL 4.1.
Явное задание всех атрибутов при помощи glBindAttribLocation тоже не прокатывает, драйвер упорно нумерует их сам. Поясню на примере.

В вершиинном шейдере, объявлены вот такие атрибуты:
attribute vec3 Vertex;
attribute vec3 TexCoord;
attribute vec3 Normal;

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

glBindAttribLocationARB( shader_handle, 0, "Vertex" );
glBindAttribLocationARB( shader_handle, 1, "TexCoord" );
glBindAttribLocationARB( shader_handle, 2, "Normal" );

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

1. пометить все атрибуты локацией -1
2. пометить используемые атрибуты валидными номерами, но пронумеровать их в обратном порядке. Т.е.
Vertex = 2;
TexCoord = 1;
Normal = 0;
Это не имеет никакого значения, если все шейдеры используют полный набор атрибутов, повторюсь. Но вот возникает ситуация, что нормаль не понадобилась. Теперь нумерация выглядит следующим образом:
Vertex = 1;
TexCoord = 0;
Ну и собственно всё, финиш. Меш общий, а атрибуты перемешались. Никто с подобным не сталкивался? Проблема, повторюсь, только на древних интелах.

std::pmr::monotonic_buffer_resource20 ноя 20238:18Dimich

Кто-нибудь пользовался новыми аллокаторами? Как узнать, сколько места осталось в ресурсе?
В исходниках есть переменная _M_avail, но она в private секции.

Вопрос по Годот.19 ноя 202318:16Tiberium

Привет, в Годот используется GDscript как один из языков. Это  что-то основанное на Пайтоне.
Вопрос.
Насколько он от оригинального Пайтона отличается (можно ли зная пайтон сразу начать кодить Годот, или нужно поизучать что-то)

Купить выкидные ножи по ссылке: nozheman.club/vykidnyye-nozhi/ в интеренет-магазине Ножеман . , Ищешь спортивные ставки на айфон? Попробуй это приложение