"Отражения" 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 ( ) Именно так я и сделал.
Теперь вторую таргет-текстуру я в нормальном виде вывожу, и её же флипаю по вертикали.
Правда оффсет не подобрал ещё Можно ещё для флипнутой текстуры в случае с водой сделать эффект волны. Будет неплохо выглядеть, мне кажется
Сообщение отредактировал 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) --------------------------------------------- никак не могу расчитать оффсет при масштабировании.
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
|
|
| |
|