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

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

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

Статьи

9 мая 2025

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

Вышла книга Vulkan 3D Graphics Rendering Cookbook: Implement expert-level techniques for high-performance graphics with Vulkan авторов Sergey Kosarevsky (_NetSurfer_), Alexey Medvedev (Rudybear), и Viktor Latypov (Vinil)

Читать | Комментарии [47]

6 фев 2022

Вышла книга 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]

Развитие рендера в Path of Exile
Ray Tracing Gem. Доступно бесплатно!
Microsoft анонсировала DirectX Raytracing (DXR)
О дизайне игровых подсистем в 2048 Tournament

Термины

9 мая 2025

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

Вышла книга Vulkan 3D Graphics Rendering Cookbook: Implement expert-level techniques for high-performance graphics with Vulkan авторов Sergey Kosarevsky (_NetSurfer_), Alexey Medvedev (Rudybear), и Viktor Latypov (Vinil)

Читать | Комментарии [47]

6 фев 2022

Вышла книга 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]

Развитие рендера в Path of Exile
Ray Tracing Gem. Доступно бесплатно!
Microsoft анонсировала DirectX Raytracing (DXR)

Подсказки

9 мая 2025

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

Вышла книга Vulkan 3D Graphics Rendering Cookbook: Implement expert-level techniques for high-performance graphics with Vulkan авторов Sergey Kosarevsky (_NetSurfer_), Alexey Medvedev (Rudybear), и Viktor Latypov (Vinil)

Читать | Комментарии [47]

Вышла книга 3D Graphics Rendering Cookbook
Развитие рендера в Path of Exile
Ray Tracing Gem. Доступно бесплатно!

Новости

9 мая 2025

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

Вышла книга Vulkan 3D Graphics Rendering Cookbook: Implement expert-level techniques for high-performance graphics with Vulkan авторов Sergey Kosarevsky (_NetSurfer_), Alexey Medvedev (Rudybear), и Viktor Latypov (Vinil)

Это полностью переработанная (без шуток) вторая редакция нашей предыдущей книги 3D Graphics Rendering Cookbook. Теперь без OpenGL и с огромным количеством нового контента по Vulkan.

В книге рассказывается как:

- использовать Vulkan 1.3 и bindless rendering;
- загружать и рисовать glTF2 с PBR и анимациями (добавлены 2 главы про расширения glTF и анимации);
- сделать свой удобный bindless-only враппер над Vulkan 1.3;
- написать 3D движок на Vulkan 1.3;
- а также как не нужно делать scene graph и много примеров...

Ссылка | Комментарии [47]

6 фев 2022

Вышла книга 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]

8 апр 2020

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

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

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

4 мар 2019

Опубликована 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]

Форум

30 янв 2026

Сразу скажу, я плохо разбираюсь в OpenGL и в целом я говнокоддер.
Вообщем, я добавил возможность использовать cubemap в шейдере для отражений, и тут возникла проблема. Я хотел сделать так, что если мне например не нужны никакие отражения в материале, то я просто мог бы поставить coefficientCubemap = 0, и Cubemap бы не просчитывался, однако почему-то, если я ставлю коэффициент = 0 и не назначаю cubemap в шейдере, то объект становится полностью прозрачным, если же я назначаю его, то он появляется.
Вот код шейдера:

     vec4 result = vec4(1.0, 1.0, 1.0, 1.0);
    vec4 _texture = texture(material.texture_diffuse1, texCoord);
    vec3 _lighting = vec3(0.0);
    for(int i = 0; i < countDirLight; i++)
        _lighting += CalcDirLight(i);
    for(int i = 0; i < countPointLight; i++)
        _lighting += CalcPointLight(i);
    for(int i = 0; i < countSpotLight; i++)
        _lighting += CalcSpotLight(i);
    float alpha = _texture.a * material.objectColor.a;
    vec3 objectColorWithLightingTexture = _lighting * _texture.rgb;
    if(material.coefficientCubemap > 0)
    {
        vec3 objectCubemap = CalcCubemap();
        vec3 objectColorWithLightingTexture_Cubemap = mix(objectColorWithLightingTexture, objectCubemap, material.coefficientCubemap);
        vec3 objectColorFinal = mix(objectColorWithLightingTexture_Cubemap, fog.colorFog, CalcFog());
        result = vec4(objectColorFinal, alpha);
    }
    else
    {
        vec3 objectColorFinal = mix(objectColorWithLightingTexture, fog.colorFog, CalcFog());
        result = vec4(objectColorFinal, alpha);
    }
    FragColor = result;

Вот код материала:

void Material::UpdateMaterial()
{
    if (!shader) return;
    shader->Update();
    unsigned int slotTexture = 0;
    for (auto& property : properties)
    {
        const UniformValue& propertyValue = property.second;
        const std::string& propertyName = property.first;

        switch (propertyValue.type)
        {
        case UniformType::Vec4: shader->setVec4(propertyName, propertyValue.vec4); break;
        case UniformType::Vec3: shader->setVec3(propertyName, propertyValue.vec3); break;
        case UniformType::Vec2: shader->setVec2(propertyName, propertyValue.vec2); break;
        case UniformType::Float: shader->setFloat(propertyName, propertyValue.f); break;
        case UniformType::Int: shader->setInt(propertyName, propertyValue.i); break;
        case UniformType::TexturePtr:
            glActiveTexture(GL_TEXTURE0 + slotTexture);
            glBindTexture(GL_TEXTURE_2D, propertyValue.tex->texture);
            shader->setInt(propertyName, slotTexture);
            slotTexture++;
            break;
        case UniformType::CubemapPtr:
            glActiveTexture(GL_TEXTURE0 + slotTexture);
            glBindTexture(GL_TEXTURE_CUBE_MAP, propertyValue.cubemap->textureID);
            shader->setInt(propertyName, slotTexture);
            slotTexture++;
            break;
        }
    }
    slotTexture = 0;
}

Вот код назначения различных данных в материал:

  Material material;
  Material terrainMaterial;
  Material cubeMaterial;
  Material CubemapMaterial;
  Texture* texture = AssetManager::LoadTexture("Assets/Textures/d8c637d6-f500-44a3-bf33-c7896b95f8a0.png");
  Texture* terrainTexture = AssetManager::LoadTexture("Assets/Textures/diff2.jpg");
  Texture* cubeTexture = AssetManager::LoadTexture("Assets/Textures/container.jpg");
  material.shader = standartShader;
  material.Set("material.texture_diffuse1", texture);
  material.Set("material.coefficientCubemap", 0.2f);
  material.Set("material.Cubemap", cubeMapDefaultSkyBox);
  terrainMaterial.shader = standartShader;
  terrainMaterial.Set("material.texture_diffuse1", terrainTexture);
  terrainMaterial.Set("material.Cubemap", cubeMapDefaultSkyBox);
  terrainMaterial.Set("material.coefficientCubemap", 0.0f);
  cubeMaterial.surfaceType = SurfaceType::Transparent;
  cubeMaterial.shader = standartShader;
  cubeMaterial.Set("material.texture_diffuse1", cubeTexture);
  cubeMaterial.Set("material.coefficientCubemap", 0.0f);
  cubeMaterial.Set("material.Cubemap", cubeMapDefaultSkyBox);
  cubeMaterial.Set("material.objectColor", glm::vec4(0.8f, 0.5f, 1.0f, 0.5f));
  CubemapMaterial.shader = cubemapShader;
  CubemapMaterial.Set("cubemap", cubeMapDefaultSkyBox);
  SceneManager::Get().CreateScene();
  SceneManager::Get().LoadScene(0);

Вроде по логике все должно работать четко, однако нет. Я не понимаю, в чем дело.
То есть, если я просто делаю так: terrainMaterial.Set("material.texture_diffuse1", terrainTexture);
  terrainMaterial.Set("material.coefficientCubemap", 0.0f); 
То terrain исчезает

27 янв 2026

В общем то, оно не критично, пока мощностей хватает. Но в беседах с ИИ, он каждый раз меня подводит к совершенно разным решениям. Обычно любой вопрос в эту тему и сразу совет использовать discard. Я так и думал раньше и не сомневался, но чёт в шейдерах редко стал попадаться и я подумал что все не парятся и так наложение пройдёт не накладно, а вернее его не будет при полной прозрачности.
Но гугл меня убедил, что это не так и очень накладно, посоветовал заменить квадратные спрайты, на кучу разных многоугольников, чтобы сократить количество прозрачных пикселей. Я спросил, как я эту кашу, смогу одним вызовом нарисовать. В один раз он согласился, что квадраты тогда практичнее, а в другой раз (да я не удержался его снова подколоть), он сказал, что мне надо взять базу 8 угольник, и просто сводить не используемые вершины в одну точку. Потом мы обсудили и выяснилось, что если спрайты меньше чем 32х64, то вообще не надо ничего оптимизировать. Ну я стал склонятся к 6 угольнику, базовому или вообще постоянно. Но эта падла мне рассказала, что по граница соприкосновения треугольников - страшная штука, там пиксели дважды рисуются.
Тогда я уже стал бедолагу мучать разными вопросами, понимая что мне не договаривают что-то. Дальше  получил ответ, что в 2026 - надо на MSAA надеяться и отключать вообще альфа смешивание.А дискарт мол, только для эффекторов требующих грубые края.
Предлагает использовать Z-buffer, но если так почитть в инете, то народ больше склоняется к сортировке на CPU и отключению Z-buffer'а.
Все мозги разбил на части, Все извилины заплёл (С)
Я теперь вообще реально в сомнениях как надо правильно. Тестировал дискар и без него, разницы не было... Может кто-то уже все варианты и их сочетания пробовал и знает ответ?

18 янв 2026

Контекст - свой движок.

На 3D сцене Y - вверх (мне так нравится).
Координаты мыши - Y вниз, такими их предоставляет ОС, и вообще так везде.

Пока сделал и на UI Y вверх, чтобы было так же как в 3D (тоже Z вперед, как с глубиной), но вот учитывая что мышь вроде как с точки зрения юзера в том же пространстве что и UI, стал сомневаться.

Аргументы?

17 янв 2026

Хочу сам программно кодом считать UV.

И вот есть такая сетка из шести треугольников.
OdmoT | Ray Tracing Gem. Доступно бесплатно!

Хочу получить такое
wlUCG | Ray Tracing Gem. Доступно бесплатно!

Что приходит на ум, площадь треугольников.
Но потом не ясно как эту площадь перевести в UV координаты 2д текстуры.

Вот сама 2д текстура такая
9H9hX | Ray Tracing Gem. Доступно бесплатно!

17 янв 2026

На текущем проекте столкнулся с бардаком в файловых путях: где-то unix-style, где-то windows-style. Пути представлены обычными строками (самописными), формируются динамически, из-за этого например поиск в hash map может фелится, потому-что где-то в легаси код подставляет другие слэши отличные от тех что использовались при записиси hash map и вылезают баги.

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

16 янв 2026

Ищу единомышленников для создания игры на годот,если кому будет интересно делать демку со мной для портфолио или вообще в продакшен)
У меня есть опыт ( 2года в годот+ блендер на уровне мидла)
Есть наработки по сюжету и игровым механикам, я открыт для любых предложений, но если надо будет движок на юнити сменить то я  буду почти бесполезен, годот моя сила)))
Суть геймплея: красивенный процедурный мир в лоуполи стиле, с пещерами и скалами, но небольшой по размеру.Он будет использоваться в качестве арены. Катка длится 3 минуты, за которые игрок должен: собрать ресурсы и завалить босса если не получилось то заново. Эдакое развитие через смерть)
Механика, о которой я говорил в названии это и есть механика создания лоуполи мира, потому что это сложно, но я сделал прототип)
Если кому интересно будет вот мой тг: @Danielboosh

15 янв 2026

Как скопировать цветовой фрейм-буфер с Float во фрейм-буфер с Byte? Неужели полноценный рендеринг мутить?

15 янв 2026

-как сделать картинки для ачивок Стим?

-Какой там размер, какие рекомендации, какие инструменты, ресурсы лучше использовать?

-Может где-то есть готовые картинки для ачивок которые можно скачать бесплатно?

12 янв 2026

Добрый день!

Я работаю на UE4, на довольно старом железе. Такой вопрос насколько много выигрыша в производительности я получу, если сделаю текстуры для материалов объектов не 4к, а, скажем, 2к или даже 1к (нормали и roughness)?

7 янв 2026

Для некоторых полигонов(2 треугольника)
Подходит такие числа для uv

//first triangle
0,0
0,1
1,1

//second triangle
1,0
0,0
1,1

Но для некоторых нет.
Как определить правильный uvs?
Это зависит от clock wise?