Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 24.02.2026
Сообщений: 2

Как корректно работать с Additive наложениями для Spine в DirectX9?

24.02.2026, 17:27. Показов 508. Ответов 1

Студворк — интернет-сервис помощи студентам
Всем привет. Завожу поддержку аддитивного слоя для спайнов в свой небольшой игровой движок. Использую бибилотеку esotericsoftware spine-cpp.
Периодически ловлю разного рода артефакты подсветки нижележащих слоёв на вышележащие, вот как на 1.png. Видно, как края квадрата аддитивного слоя, лежащего ниже(2.png - структура слоёв спайна. проблемный помечен цифрой 2), выступают на вышележащие. Сама png, которая используется в спайне - 3.png, для анимации свечения радуги используется соответствующий квадрта. premultiplied альфа для спайна отключена.
Движок использует DirectX9, в нём определены шейдеры и техника как для аддитивного, так и для обычного нормального слоёв.

Сорри, формата для HLSL не нашёл. Использую плюсовый
Для аддитива:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
VS_OUTPUT_TEXTURE VS_Texture_Additive(VS_IN vs_in)
{
    VS_OUTPUT_TEXTURE vs_out;
    vs_out.pos   = mul(float4(vs_in.pos, 1.0f), WVP);
    vs_out.color = float4(vs_in.color.rgb * vs_in.color.a, vs_in.color.a);
    vs_out.uv    = vs_in.uv;
    vs_clip;
    return vs_out;
}
 
float4 PS_Texture_Additive(VS_OUTPUT_TEXTURE ps_in) : COLOR
{
    ps_clip;
 
    float4 texColor = tex2D(texture0Sampler, ps_in.uv);
    float3 srcRGB = (texColor.rgb * texColor.a) * ps_in.color.rgb;
    float4 color = float4(srcRGB, texColor.a * ps_in.color.a);
 
#ifdef GRAY_SCALE
    color = grayscale(color);
#endif
 
    return color;
}
 
technique BlendAdditivePrimitive
{
    pass MainPass
    {
        VertexShader = compile vs_2_0 VS_Texture_Additive();
        PixelShader  = compile ps_2_0 PS_Texture_Additive();
 
        ZENABLE  = TRUE;
        ZWRITEENABLE = TRUE;
        CULLMODE = NONE;
        LIGHTING = FALSE;
 
        ALPHABLENDENABLE = TRUE;
 
        SrcBlend  = One;
        DestBlend = One;
        BlendOp   = ADD;
 
        SeparateAlphaBlendEnable = TRUE;
        SrcBlendAlpha   = Zero;
        DestBlendAlpha  = One;
        BlendOpAlpha    = ADD;
    }
}
Для обычного нормального слоя:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
VS_OUTPUT_TEXTURE VS_Texture(VS_IN vs_in)
{
    VS_OUTPUT_TEXTURE vs_out;
    vs_out.pos = mul(float4(vs_in.pos, 1.0f), WVP);
    vs_out.color = float4(vs_in.color.rgb * vs_in.color.a, vs_in.color.a);
    vs_out.uv = vs_in.uv;
    vs_clip;
    return vs_out;
}
 
float4 PS_Texture(VS_OUTPUT_TEXTURE ps_in) : COLOR
{
    ps_clip;
    float4 texColor = tex2D(texture0Sampler, ps_in.uv);
#ifndef PREMULTIPLIED_TEXTURE_0
    texColor.rgb *= texColor.a;
#endif
    float4 color = ps_in.color * texColor;
#ifdef GRAY_SCALE
    color = grayscale(color);
#endif
    return color;
}
 
technique TexturePrimitive
{
    pass MainPass
    {
        // shaders
        VertexShader = compile vs_2_0 VS_Texture();
        PixelShader = compile ps_2_0 PS_Texture();
 
        ZENABLE = FALSE;
        ZWRITEENABLE = FALSE;
        CULLMODE = NONE;
        LIGHTING = FALSE;
        ALPHABLENDENABLE = TRUE;
 
        SrcBlend = One;
        DestBlend = InvSrcAlpha;
        SeparateAlphaBlendEnable = true;
        SrcBlendAlpha = One;
        DestBlendAlpha = InvSrcAlpha;
        BlendOp = ADD;
        BlendOpAlpha = ADD;
    }
}
Переключение между техниками происходит при отрисовке каждого слоя отдельно, начиная от нижележащих и заканчивая вышележащими:

C++
1
2
3
4
5
6
7
8
9
10
        ............
        if (material.blendingType == blending::BlendMode_Additive)
        {
            _currentEffect->setBlendAdditiveTechnique();
        }
        else
        {
            _currentEffect->setTextureTechnique();
        }
        ............
Никакие другие типы слоёв в спайне не присутствуют. Подскажите, пожалуйста, в чём дело?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2026, 17:27
Ответы с готовыми решениями:

Как узнать какая стрелка нажата на Spine'е?
Мне нужно с помошью Spin'a изменять значение текстового поля. Обрабатываю сообщение UDN_DELTAPOS....

Где скачать DirectX9 SDK???
Где скачать DirectX9 SDK??? И еще вопросик чем лучше пользоваться новичку в графике? DirectX или...

DirectX9 Direct3D
Здравствуйте! Возникла проблема: При загрузке х. файлов из пакета ДиректХ все нормально (тот же...

1
0 / 0 / 0
Регистрация: 24.02.2026
Сообщений: 2
24.02.2026, 17:30  [ТС]
Вот пикчи
Миниатюры
Как корректно работать с Additive наложениями для Spine в DirectX9?   Как корректно работать с Additive наложениями для Spine в DirectX9?  
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2026, 17:30
Помогаю со студенческими работами здесь

DirectX9 "LPD3DXFONT не содержит члена Begin()"
Изучаю DirectX9 столкнулся с проблемой. Как вывести текст на экран? В книге очень много ошибок в...

VS2012+DirectX9 многократно определенный символ
Решил растаскать по файлам свой проект, а то все как то в куче. После сего действия начало ругатся...

Первый опыт с DirectX9. Странное поведение программы
Решил начать осваивать DirectX. Взял код из этого урока, где рисуется треугольник...

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

Работа с файлом (корректный код, некорректная работа программы)
Для записи и чтения файла использую разные функции. По одиночке они работают нормально. Вставляю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru