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

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Шейдер для создания объемной 2D планеты  (Прочитано 13272 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mopnex
Участник
****

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

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Unity 3D
Деятельность: Программист-рукожоп
Сообщений: 191


~(^-^)~


« : Сентябрь 21, 2016, 16:53:33 »

Три дня потратил на поиск готового шейдера для создания псевдо-3Д планет для GMS, безрезультатно. Наткнулся на сайт, на котором нашел множество крутых шейдеров. Язык GLSL, как раз то что нужно. Пришлось немного попотеть, поискать мануалов чтоб подогнать эти шейдеры под гамак, но в итоге получилось) Оставлю пример тут, может знатоки подскажут что сделал не так, что можно оптимизировать, переделать. Внешне всё работает, но мог и накосячить при переносе, хотелось бы сделать данный шейдер более универсальным, для создания различных планет. Помощь исправлении багов и улучшении шейдера приветствуется  

Добавлено: Сентябрь 21, 2016, 17:17:21
Так же добавлю шейдер солнца  

Добавлено: Сентябрь 21, 2016, 17:39:03
Вот переделал еще один космический шейдер для создания красивого космоса)
Всё, стартовый набор для создания игры космические рейнджеры готов!  
ПыСы: Добавил рабочий пример работы шейдера

* Shader_Sun.gmz (14.18 Кб - загружено 688 раз.)
* Shader_Space.gmz (10.87 Кб - загружено 677 раз.)
* Shader_planet.gmz (1633.18 Кб - загружено 633 раз.)
* Project2.gmx.zip (2780.59 Кб - загружено 594 раз.)
« Последнее редактирование: Февраль 25, 2017, 20:19:20 от Mopnex » Записан

Ушёл в себя. Вышел из себя. Пришёл в себя. Норм погулял.
skypo
GM Pro user
*

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

Пол: Мужской
Награды:
500 сообщений!За постоянность! [50 дней на форуме]
API: GameMaker Studio Pro
Сообщений: 809


WWW
« Ответ #1 : Сентябрь 21, 2016, 18:27:59 »

осталась самая мелочь - собственно собрать игру 
Записан
Mopnex
Участник
****

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

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Unity 3D
Деятельность: Программист-рукожоп
Сообщений: 191


~(^-^)~


« Ответ #2 : Сентябрь 21, 2016, 18:39:00 »

игра и создается из мелочей

Добавлено: Сентябрь 21, 2016, 23:19:27
исправил шейдер планеты, теперь он рисует как надо, вложение обновил.
« Последнее редактирование: Сентябрь 21, 2016, 23:19:27 от Mopnex » Записан

Ушёл в себя. Вышел из себя. Пришёл в себя. Норм погулял.
NickLatkovich
Никита Латкович
GM Pro user
*

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

Пол: Мужской
Награды:
500 сообщений!За постоянность! [10 дней на форуме]За лояльность! [+150 репутации]3 место в Весеннем конкурсе. Игра
API: GameMaker Studio Master
Сообщений: 853


7*3=21;73=p(21);37=p(12)


WWW
« Ответ #3 : Сентябрь 22, 2016, 09:01:36 »

Эммм... Я конечно поставлю плюсик за старание... Но... FPS == 6???

P.S. для сравнения, такая же планета из двух 3D сфер (небо и земля) на моём супер-медленном компе выдаёт... 260 FPS.
Записан

luden
GM Pro user
*

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

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #4 : Сентябрь 22, 2016, 09:43:20 »

Мне одному кажется, что выглядит жутко? Я не знаю как именно там реализован бампмап, но он даёт херову тучу лишних теней которые просвечивают сквозь всё подряд.
Короче вот - https://habrahabr.ru/post/248381/
Записан
Mopnex
Участник
****

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

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Unity 3D
Деятельность: Программист-рукожоп
Сообщений: 191


~(^-^)~


« Ответ #5 : Сентябрь 22, 2016, 14:36:38 »

Мне одному кажется, что выглядит жутко? Я не знаю как именно там реализован бампмап, но он даёт херову тучу лишних теней которые просвечивают сквозь всё подряд.
Короче вот - https://habrahabr.ru/post/248381/
А сможешь их шейдер переписать на GLSL? я пытался, в итоге не вышло  , а вдохновлялся именно этим постом. Жаль что их шейдер написан на HLSL, пока что безуспешно пытаюсь переписать его на GL
Записан

Ушёл в себя. Вышел из себя. Пришёл в себя. Норм погулял.
DmitryDS
Потому что я такой-сякой
GM Pro user
*

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

Награды:
За лояльность! [+150 репутации]1000 сообщений!За постоянность! [100 дней на форуме]
API: GameMaker Studio Master
Сообщений: 1061



WWW
« Ответ #6 : Сентябрь 22, 2016, 14:43:09 »

GM:S умеет в HLSL 9 и 11, но они не рекомендованы: первый только для 32-битных Windows, а второй - только для Win8 и виндофона.
Записан

Я никогда никого не пытаюсь оскорбить или обидеть, хотя порой веду себя вызывающе. Не обижайтесь, я не со зла
Mopnex
Участник
****

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

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Unity 3D
Деятельность: Программист-рукожоп
Сообщений: 191


~(^-^)~


« Ответ #7 : Сентябрь 22, 2016, 14:58:39 »

GM:S умеет в HLSL 9 и 11, но они не рекомендованы: первый только для 32-битных Windows, а второй - только для Win8 и виндофона.
И как тогда быть? как переписать тот шейдер с хабра? Если с GL я еще чуток разобрался, то в HL вообще не шарю 

Добавлено: Сентябрь 22, 2016, 23:22:56
Вообщем прикрепляю простенький шейдер, опять же для создания планет, без атмосферы и освещения. Проблема как и с предыдущими, как заставить его рисоваться в других местах кроме верхнего левого угла экрана?

* Shader_Planet_Easy.gmz (807.91 Кб - загружено 597 раз.)
« Последнее редактирование: Сентябрь 22, 2016, 23:22:58 от Mopnex » Записан

Ушёл в себя. Вышел из себя. Пришёл в себя. Норм погулял.
Dmi7ry
Гл. Администратор
*

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

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #8 : Сентябрь 23, 2016, 09:40:56 »

Проблема как и с предыдущими, как заставить его рисоваться в других местах кроме верхнего левого угла экрана?
Если не хватает скиллов в шейдерах, то рисуйте в сурфейс, который выводите в любое место экрана.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Mopnex
Участник
****

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

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Unity 3D
Деятельность: Программист-рукожоп
Сообщений: 191


~(^-^)~


« Ответ #9 : Сентябрь 23, 2016, 11:35:46 »

Проблема как и с предыдущими, как заставить его рисоваться в других местах кроме верхнего левого угла экрана?
Если не хватает скиллов в шейдерах, то рисуйте в сурфейс, который выводите в любое место экрана.
Хотелось бы осилить шейдеры, чтоб производительность не страдала 

Добавлено: Сентябрь 24, 2016, 13:53:21
Помогите разобраться с проблемой, есть шейдер рисующий планету (в проекте планета Земля), отрисовывает отлично, если не одно но (точнее два) : если добавить еще какой-нибудь спрайт (в примере пустой спрайт 200*200) он начинает рисоваться (хотя в шейдере явно указано что должен рисоваться один спрайт текстуры планеты) и вторая проблема это невозможность перемещения области отрисовки (рисует только в левом верхнем углу и нигде больше, для наглядности на стрелках сделал перемещение объекта).

Тут отрисовывается если добавить пустой спрайт (нигде его не используя)

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

* Shader_Planet_Earth.gmz (687.04 Кб - загружено 555 раз.)
« Последнее редактирование: Сентябрь 24, 2016, 13:53:24 от Mopnex » Записан

Ушёл в себя. Вышел из себя. Пришёл в себя. Норм погулял.
Dmi7ry
Гл. Администратор
*

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

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #10 : Сентябрь 24, 2016, 14:05:08 »

Уже говорил вам в чате давным-давно: ставьте галочку "used for 3d", тогда изображение не будет запаковываться в текстурный атлас.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Mopnex
Участник
****

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

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Unity 3D
Деятельность: Программист-рукожоп
Сообщений: 191


~(^-^)~


« Ответ #11 : Сентябрь 24, 2016, 15:35:52 »

Уже говорил вам в чате давным-давно: ставьте галочку "used for 3d", тогда изображение не будет запаковываться в текстурный атлас.
Спасибо! Забыл совсем про это) Осталось разобраться с отрисовкой шейдера по месту нахождения объекта)

Добавлено: Сентябрь 24, 2016, 18:18:20
Вертекс шейдер
Код:
//
// Simple passthrough vertex shader
//
attribute vec3 in_Position;                  // (x,y,z)
varying vec2 fragCoord;
//varying vec4 v_pos;
void main()
{
    vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
    gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
    //v_pos=gm_Matrices[MATRIX_WORLD]*object_space_pos;
    fragCoord = in_Position.xy;
   
}
Фрагмент шейдер -
Код:
//
// Simple passthrough fragment shader
//
const float pi = 3.14159265;
uniform vec2 iResolution;
uniform float iGlobalTime;
uniform sampler2D iSprite;
varying vec2 fragCoord;
//varying vec4 v_pos;
void main()
{
    //vec2 fragCoord = v_pos.xy;
    vec2 uv = fragCoord.xy / iResolution.yy;
    vec2 p = 2.0 * (uv - 0.5); 
    float r = sqrt(p.x*p.x + p.y*p.y);
    if (r<=1.0) {
    float d = r != 0.0 ? asin(r) / r : 0.0;
    vec2 p2 = 1.5*d * 1.5*p;
    float x3 = mod(p2.x / (pi*2.0) + 0.5 + iGlobalTime*0.1, 1.0);
    float y3 = p2.y / (pi*2.0) + 0.5;
    vec2 newCoord = vec2(x3, y3);
    vec4 sphereColor =  texture2D(iSprite, newCoord);
    gl_FragColor = sphereColor;
    } else
        {
            gl_FragColor =  vec4(0.0,0.0,0.0, 0.0);
        }
}

В Draw -
Код:
shader_set(shader_planet);
shader_set_uniform_f(resolt, 200,200);
shader_set_uniform_f(time, current_time/1000);
texture_set_stage(samp_spr,tex_sprite);
draw_sprite(sprite2, 0, x,y);
shader_reset();
draw_text(x,y,string(fps_real ));
« Последнее редактирование: Сентябрь 24, 2016, 18:18:20 от Mopnex » Записан

Ушёл в себя. Вышел из себя. Пришёл в себя. Норм погулял.
life Jumb
GM Pro user
*

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

Пол: Мужской
Награды:
1000 сообщений!За постоянность! [100 дней на форуме]За лояльность! [+150 репутации]За добавление полезных программ!Третье место на HellRoom Jam #6 [Игра на конкурс]2 место в конкурсе Адекватные игры #3 [Антиутопия]
API: GameMaker Studio Pro
Деятельность: Программист
Сообщений: 1512



WWW
« Ответ #12 : Сентябрь 24, 2016, 18:35:16 »

vec4 sphereColor =  texture2D(iSprite, newCoord); вот тут у тебя рисуемая текстура униформой
а что у тебя в gm_BaseTexture, что такое sprite2?
Пробовал заменить их или вообще использовать gm_BaseTexture?

И кде вообще код когда ты передаешь iSprite через униформу почему она у тебя вообще рисуется, по логике вообще должно забаговать
Записан

 
Mopnex
Участник
****

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

Пол: Мужской
Награды:
За постоянность! [10 дней на форуме]
API: Unity 3D
Деятельность: Программист-рукожоп
Сообщений: 191


~(^-^)~


« Ответ #13 : Сентябрь 24, 2016, 20:07:12 »

vec4 sphereColor =  texture2D(iSprite, newCoord); вот тут у тебя рисуемая текстура униформой
а что у тебя в gm_BaseTexture, что такое sprite2?
Пробовал заменить их или вообще использовать gm_BaseTexture?

И кде вообще код когда ты передаешь iSprite через униформу почему она у тебя вообще рисуется, по логике вообще должно забаговать

vec4 sphereColor =  texture2D(iSprite, newCoord); - вот тут используется iSprite, тут высчитывает текстурные координаты, но как ты сказал, я убрал это, и сделал через gm_BaseTexture
Записан

Ушёл в себя. Вышел из себя. Пришёл в себя. Норм погулял.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

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