Game Maker - создание игр | HellRoom Games
Январь 16, 2025, 09:15:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите разобраться с шейдером типа Color Doge  (Прочитано 5373 раз)
0 Пользователей и 1 Гость смотрят эту тему.
qwer643
Новичок
*

Репутация: 0
Offline Offline

API: Game Maker 6.1
Сообщений: 2


« : Декабрь 30, 2017, 18:14:59 »

Уважемые господа форумчане.
Устал гуглить, может кто знает, как сделать лучше.

Я рисую пиксельную графику в Paint.Net - использую слои и разные режимы наложения, но при переносе в GM (у меня версия Standart Edition v1.4.1772) нет необходимых мне режимов смешивания. В связи с чем решил попробовать написать шейдеры соответствующие задаче -
 для чего кстати весьма удобно использовать www.shadertoy.com

Суть проблемы: не понимаю, как передать шейдеру, то, что уже нарисовано на экране.

Код:
/// shd_color_doge : fragment

varying vec2 v_vTexcoord;
varying vec4 v_vColour;

uniform sampler2D bottom_texture;

void main()
{
    // инвертируем текстуру спрайта
    vec4 invertTop = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
    invertTop.r = 1.0 - invertTop.r;
    invertTop.g = 1.0 - invertTop.g;
    invertTop.b = 1.0 - invertTop.b;
   
    // преобразовываем исходную текстуру
    vec4 result = texture2D(bottom_texture, v_vTexcoord);
    result.r /= invertTop.r;
    result.g /= invertTop.g;
    result.b /= invertTop.b;
   
    gl_FragColor = result;
}

идея была - дождаться, когда основная картинка нарисуется и передать шейдеру данные из application_surface при помощи события
Draw End

Код:
shader_set(shd_color_doge);
    texture_set_stage(bottom_texture, surface_get_texture(application_surface));
    draw_sprite(spr_flare, 0, mouse_x, mouse_y);
shader_reset();

В таком простом виде к сожалению не работает.
*(пробовал создать прослойку из еще одного surface - помогает, но получается очень громоздко и почему-то картинка рисуется периодически - мерцает)

Посоветуете, что-нибудь?)))
Записан
MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #1 : Декабрь 30, 2017, 18:38:47 »

У вас размер спрайта и application_surface одинаковые разве?
« Последнее редактирование: Декабрь 30, 2017, 19:05:29 от MusNik » Записан

qwer643
Новичок
*

Репутация: 0
Offline Offline

API: Game Maker 6.1
Сообщений: 2


« Ответ #2 : Декабрь 30, 2017, 19:17:38 »

Это вряд ли)))
Боюсь показаться невеждой - но он должен?

Сейчас пытаюсь перерисовать application_surface на surface-прослойку, которая такого же размера как спрайт.
Однако после вызова texture_set_stage() - я перестаю понимать что происходит.

Может я иду не тем путем?
И нужно использовать например shader_set_uniform_f() - чтобы передать прослойку?

Но тогда я не понимаю как объявить в шейдере переменную, возникают ошибки. (((
Записан
MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #3 : Декабрь 30, 2017, 19:42:41 »

Однако вы используете один v_vTexcoord для обоих. То есть рисуете сурфейс по текстурным координатам спрайта.

Я бы "первым" рисовал сурфейс, то есть на него шейдер накладывал со спрайтом уже в texture_set_stage, а не наоборот (при условии, что спрайт меньше appliciation_surface, как обычно и бывает).
+ Надо завести три униформы для позиции, размера и UV-координат спрайта. Ты, как бы, этот спрайт будешь рисовать по отношению к сурфейсу, в его пространстве так сказать, но со своими сдвигами, которые в этих униформах и укажешь. Подобное недавно было тут: http://forum.hellroom.ru/index.php?topic=24957.msg307973#msg307973

Альфу спрайта тоже можно будет в униформе передать. Надеюсь, тебе не надо будет этот спрайт масштабировать и поворачивать, в таком случае уже придётся ДИКИЕ матрицы использовать.
Записан

Aristokrat952
Твоя мама - лама
GM Pro user
*

Репутация: 385
Offline Offline

Пол: Женский
Награды:
1 место в Дичайшем джеме #8500 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+150 репутации]1 место в конкурсе Адекватные игры #3 [Антиутопия]3 место в конкурсе ...
API: Game Maker 8.0 Pro
Деятельность: Чет там делает
Сообщений: 1311


Дмитрий - зануда.


« Ответ #4 : Декабрь 30, 2017, 20:58:01 »

https://youtu.be/amuiRiB_Pt0?t=254
Записан

Статус: сплю и анимешусь с Яшей
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.085 секунд. Запросов: 29.