Вышла книга 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]
9 мая 2025
Вышла книга 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: A comprehensive guide to exploring rendering algorithms in modern OpenGL and Vulkan авторов Sergey Kosarevsky (_NetSurfer_) и Viktor Latypov (Vinil)
Читать | Комментарии [50]
9 мая 2025
Вышла книга 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: A comprehensive guide to exploring rendering algorithms in modern OpenGL and Vulkan авторов Sergey Kosarevsky (_NetSurfer_) и Viktor Latypov (Vinil)
Читать | Комментарии [50]
9 мая 2025
Вышла книга 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]
9 мая 2025
Вышла книга 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: 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.
И вот есть такая сетка из шести треугольников.

Хочу получить такое

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

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?
| Кредит где в качестве залога выступает недвижимость кредит где в качестве залога выступает недвижимость zalogcity.ru |