Понедельник, 18 Ноября 2024, 18:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
"Отражения" SDL2.
AlkoshaДата: Среда, 24 Декабря 2014, 08:22 | Сообщение # 1
участник
Сейчас нет на сайте
Вот скетч, набросал в графическом редакторе, но хочу реализовать подобное (отражение в "воде") на SDL2.



Поначалу казалось, что задачка элементарная. Но не тут-то было.
До данной затеи была одна таргет-текстура, на которую я рендерил всё подряд SDL_SetRenderTarget(renderer, texTarget);. Зачем она нужна, спросите вы? Чтоб зумить, создавать эффект приближения\удаления камеры относительно сцены.

Создал две таргет-текстуры.
На одной рисую бэкграунд, на второй то, что будет выводиться как в нормальном виде, так и в отзеркаленном... Но нужно очищать область рендеринга. Именно таким образом, чтоб вся текстура была прозрачной в следующем цикле рендеринга.

как поступить в таком случае ? Каждый раз дэстроить текстуру (SDL_DestroyTexture(texTarget);) и создавать заново? Не затратно ли это в плане производительности ?

Добавлено (24 декабря 2014, 08:22)
---------------------------------------------

Цитата Alkosha ()
Каждый раз дэстроить текстуру (SDL_DestroyTexture(texTarget);) и создавать заново?


Именно так я и сделал.

Теперь вторую таргет-текстуру я в нормальном виде вывожу, и её же флипаю по вертикали.

Правда оффсет не подобрал ещё.



Сообщение отредактировал Alkosha - Воскресенье, 21 Декабря 2014, 00:11
SaiteiДата: Среда, 24 Декабря 2014, 08:30 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата Alkosha ()
Именно так я и сделал.

Теперь вторую таргет-текстуру я в нормальном виде вывожу, и её же флипаю по вертикали.

Правда оффсет не подобрал ещё

Можно ещё для флипнутой текстуры в случае с водой сделать эффект волны. Будет неплохо выглядеть, мне кажется smile


Сообщение отредактировал Saitei - Среда, 24 Декабря 2014, 08:31
AlkoshaДата: Среда, 24 Декабря 2014, 08:43 | Сообщение # 3
участник
Сейчас нет на сайте
Цитата Saitei ()
Можно ещё для флипнутой текстуры в случае с водой сделать эффект волны


SDL2 не умеет шейдеры. А а getpixel \ setpixel для такого массива пикселей будут адски грузить проц.

Добавлено (24 декабря 2014, 08:43)
---------------------------------------------
Я попросту приплюсну по вертикали. Но тут гемор с оффсетом, так как камера у меня ещё должна двигаться по Z (масштабирование картинки), и оффсет зависит от зума.


Сообщение отредактировал Alkosha - Среда, 24 Декабря 2014, 08:45
Snake174Дата: Среда, 24 Декабря 2014, 10:29 | Сообщение # 4
участник
Сейчас нет на сайте
Цитата
SDL2 не умеет шейдеры.

http://forums.libsdl.org/viewtopic.php?t=6946&sid=e1086f0489c98133fc10fe202ca08214

Можно в принципе ещё делать всё на чистом OpenGL, а SDL использовать только для создания окна и обработки ввода.


Не следует обманывать инспектора
Pipmak Assistant
Love2D Exporter
Love2D-Helpers
Old Consoles Games


Сообщение отредактировал Snake174 - Среда, 24 Декабря 2014, 10:32
AlkoshaДата: Суббота, 27 Декабря 2014, 15:25 | Сообщение # 5
участник
Сейчас нет на сайте
Цитата Snake174 ()
Можно в принципе ещё делать всё на чистом OpenGL, а SDL использовать только для создания окна и обработки ввода.


Про это я знаю. А я говорил про чистый SDL2.

Добавлено (24 декабря 2014, 11:51)
---------------------------------------------
Когда-то давно пытался настроить проект кодблокса на openGL+SDL, так ничего и не получилось. Раздельно openGL-проект и SDL-проект пашут, а в одном проекте - шляпа. С тех пор я и забил.

Добавлено (24 декабря 2014, 11:54)
---------------------------------------------
Цитата Snake174 ()
а SDL использовать только для создания окна и обработки ввода.


По сути, тот же glut можно использовать, не обязательно SDL

Добавлено (27 декабря 2014, 15:25)
---------------------------------------------
wink никак не могу расчитать оффсет при масштабировании.

Textarget - нормальное изображение, Textarget2 - отзеркаленное.

(cum - класс камеры)
Спрайты на textarget размещаются по X-cum.x, Y-cum.y

Код

        SDL_Rect dstrect;
        dstrect.w=800*cum.z;
        dstrect.h=600*cum.z;
        dstrect.x=400-400*cum.z;
        dstrect.y=300-300*cum.z;
        SDL_Point center;
        center.x=400;
        center.y=300;

        SDL_SetTextureBlendMode(texTarget,SDL_BLENDMODE_BLEND);
        SDL_SetTextureBlendMode(texTarget2,SDL_BLENDMODE_BLEND);

        SDL_SetRenderTarget(renderer, NULL);
        SDL_RenderCopyEx(renderer, texTarget, NULL, &dstrect, cum.angle,
        ¢er, SDL_FLIP_NONE); //БЭКГРАУНД (1-ый план)

    SDL_RenderCopyEx(renderer, texTarget2, NULL, &dstrect, cum.angle,
      ¢er, SDL_FLIP_NONE); // НОРМАЛЬНОЕ ИЗОБРАЖЕНИЕ (2-ой план)

        dstrect.y=-300*cum.z; // ВОТ ТУТА НАДО КАК-ТО РАСЧИТАТь ПОЗИЦИОНИРОВАНИЕ ТЕКСТУРЫ ПО Y

        SDL_SetTextureAlphaMod(texTarget2,100);
        SDL_RenderCopyEx(renderer, texTarget2, NULL, &dstrect, cum.angle,
        ¢er, SDL_FLIP_VERTICAL); // ОТРАЖЕНИЕ

        effects.shading();
        gui.display();
        dialog.display();
        SDL_RenderPresent(renderer);
        SDL_DestroyTexture(texTarget2);


Сообщение отредактировал Alkosha - Суббота, 27 Декабря 2014, 16:02
PoidetLiДата: Понедельник, 15 Июня 2015, 17:40 | Сообщение # 6
участник
Сейчас нет на сайте
Цитата Alkosha ()

dstrect.y=(300-300*cum.z)*-1; ;
Может так?


в еюдуго прсхлуренц
http://gcup.ru/forum/9-44187-1 мой Project 96
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг