ПрограммированиеФорумГрафика

Стёкла с преломлениями, оптимизация отрисовки (2 стр)

Страницы: 1 2
#15
17:24, 13 апр 2015

Моласар
> Плавность же обеспечивается ограничением фпс на психологически важной отметке
> 60 долларов за баррель, для динамичных шутеров - 100.
Я про это и говорю - если у тебя выбор - 60 fps и одно преломляющее стекло, или 45 fps и пять стекол. Что ты выберешь?

#16
17:27, 13 апр 2015

>Всё равно, впервые слышу про какие-то конвееры. Вроде до сих пор многопоточные драйверы реализованы не везде
Эээ, какбы, это всё внутри железа видеокарты, когда она раскидывает работу по своим 100500 параллельно работающих ядер.
И, как бы, буфер, из которого можно одновременно писать и читать - это до сих пор фантастика, враждебная внутренней архитектуре видеокарт (типо, как понадобился бы диспетчер записи в память как бы не более сложный чем все шейдерные конвейеры).

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

#17
17:42, 13 апр 2015

Sergio
Для начала надо задать себе вопрос, как так произошло, что фпс с одним стеклом всего 60, а не, скажем, 400.
Я задам вопрос иначе. Если у тебя есть выбор, 400 фпс и одно преломляющее стекло, и 250 фпс и пять стёкол, при этом ограничитель стоит на 60 фпс, что ты выберешь?
Cheb
Синхронизация.

#18
17:47, 13 апр 2015

>- если у тебя выбор - 60 fps и одно преломляющее стекло, или 45 fps и пять стекол. Что ты выберешь?
Выбирай DRR! Моё поделие позволяет менять нагрузку на филлрейт в триста раз (от "эташто, 320х200?" до "нублин, ктожтак суперсемплинтуповлобделает"), а фпсы при этом меняются в тридцать раз (от 300 до 10).

#19
20:14, 13 апр 2015

Моласар
>>А, ну с FBO я тут не работаю
Да я уже тоже вернулся на CopySubImage.
>.Ну ты всё равно до конца года будешь баги в п2 исправлять.
Да всё я поправил. Это я так, над совместимостью и оптимизацией работаю. Убер-шейдеры запилил вот.
>>Ублюдочный OpenGL. В D3D такого нет
Да там может что-то другое есть, откуда я знаю?

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

float x, y, w, h;
ScissorFromAABB( mins, maxs, &x, &y, &w, &h ); // переводим полигон стекла\зеркала\водной поверхности в экранные координаты скиссора

float newY = ScreenHeight - h - y;
glCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_NV, 0, x, newY, x, newY, w, h ); 

Вот так работает правильно и прирост весьма ощутим. Для дебага я эту текстуру рендерил в FSQ, чтобы убедиться, что обновляется только то, что должно.

>>Сделать дисторшн-буффер, рисовать стёкла back-to-front
Ну естественно я их и рисую от дальнего к ближнему.

>>Такие проблемы в реалтайме никто не решает. И надо сказать правильно делают.
>>+1
Любопытная логика. Как по мне, так я скорее откажусь от реалтаймовой боле-мене честной каустики, которая жрёт-мама-не-горюй и на которую никто не обращает внимания, чем от дешевых преломлений на стеклах. У меня к примеру сейчас 36 частичных копирований экрана и фпс держится в раёне 300 на 9800GT.
Конечно я буду и дальше оптимизировать, да и этот случай - вырожденный, но тем не менее.

#20
20:19, 13 апр 2015

>>И если это у кого-то работает - это недоработка драйвера, который недостаточно граммар наци что допустил такое
Ну я очень быстро понял, что это довольно стрёмная техника. Не удивлюсь, если бы на ATI я получил синий экран после таких экспериментов.

>>Для начала надо задать себе вопрос, как так произошло, что фпс с одним стеклом всего 60, а не, скажем, 400.
Когда у тебя отложенное освещение, фпс не поднимется выше ста на большинстве видеокарт. А у подавляющего большинства оно именно отложенное.
И они соответственно про нас с тобой думают аналогично. Я правда не знаю, может ты тоже отложенное успел запилить. Я потом планировал со сферическими гармониками опыты поставить, посмотреть что получится.

#21
20:29, 13 апр 2015

g-cont
> Я правда не знаю, может ты тоже отложенное успел запилить.
Да зачем же, там с тенями извращения, и даже с обычным альфа-блендингом.
По поводу последнего - не удивлюсь, если мне тут напишут "а ты бленди только самое верхнее стекло". :)

#22
21:05, 13 апр 2015

Ну извращения - не извращения, а попробовать всё-таки надо. Для умственного развития.

#23
21:33, 13 апр 2015

g-cont
Тебе легко пробовать, у тебя банальная связка OpenGL+GLSL. А у меня мультирендер и шейдеры аж пяти разных форматов. И у каждого свои ограничения.

#24
21:35, 13 апр 2015

Кстати, о мультирендерах.
Меня глючит, или StretchRect ощутимо быстрее glCopyTexSubImage2D?

#25
23:11, 13 апр 2015

Моласар
ну кто в наше время пишет мультирендереры? Только отдельные энтузазисты!

#26
23:27, 13 апр 2015

g-cont
Эпики разве убрали мультирендер из унреала?
Точно помню, что до 2004 включительно там даже софтвар был. :)
Всё-таки, имхо, под виндой двиг должен работать под DX, а под линуксом - под OGL.

#27
15:36, 25 апр 2015

Вообщем сделал следующим образом:
1. построил скиссор для каждой поверхности-квада, чтобы копировать не весь экран, а только нужный кусочек
2. копирование выполняется для каждого стекла, стекло представлено квадом.
3. проверок на взаимопересечение не делается, т.к. в любом случае они отсортированы по дальности и каждому стеклу-кваду нужно свое обновление экрана
4. заведомо невидимые стекла отсекаются через Occlusion Query
5. для отражения в воду я запретил отрисовку стекол совсем, т.к. они достаточно прозрачные и в тёмной воде с отражениями и преломлениями не разобрать есть там эти стекла или нет.
В среднем на кадр приходится 6-8 частичных копирований экрана, фпс стал выше, чем когда было одно копирование всего экрана перед отрисовкой всех стекол (естественно взаимная прозрачность уже не работала корректно), ну и взаимная прозрачность теперь правильно работает.
Возможно есть и более другие методы, но текущий меня вполне устроил.

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.