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

Рисование объектов за преградами. opengl

Страницы: 1 2 Следующая »
#0
(Правка: 12 янв. 2021, 22:51) 23:31, 9 ноя. 2020

Первый вопрос решен. Пытаюсь решить следующий. пост


Подскажите как лучше сделать.
opengl

Рисую сцена в один fbo. Объекты в другой.
Дальше надо за преградами контуры объектов нарисовать.
Сделал шейдер где сравниваю depth-тестуры, но хороший ли это вариант?

+ Показать

вышло так.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры
#1
(Правка: 0:10) 0:08, 10 ноя. 2020

Думаю, грамотней было бы вывести первый fbo на экран, затем очистить его цвет (не трогая depth), и в тот же первый fbo рисовать, выставив соответствующий glDepthFunc.

Либо приаттачить первую depth-текстуру к второму fbo, если по какой-то причине нужны обе fbo-текстуры.

В обоих случаях Depth Test будет считаться аппаратными средствами, что лучше, чем куча if-ов в шейдере.

Если есть кто-то, кто знает ответ наверняка - буду рад услышать правильный ответ.

#2
0:32, 10 ноя. 2020
Думаю, грамотней было бы вывести первый fbo на экран, затем очистить его цвет (не трогая depth), и в тот же первый fbo рисовать, выставив соответствующий glDepthFunc.

С плоскими спрайтами это работает.
Т.е. я рисовал сцену, копировал depth-буфер и рисовал там. Но 3D модели нужно рисовать стандартно с depth test.
Если без If'ов, то надо в два прохода GL_GEQUAL и шейдер для конткуров и с GL_LEQUAL(Обычные объекты надо тоже рисовать)
Но из-за порядок прорисовки квадов гличи вылезают.

Поэтому я пришел к выводу что надо объекты рисовать в один проход со стандартной GL_LEQUAL.

#3
10:12, 10 ноя. 2020

а зачем для этого шейдер? можно просто
1)
отрисовать стены
очистить буфер глубины
отрисовать персонажей
или переключать/аттачить разные depth target, если у тебя Frame buffer-ы узаются

2)ничего не очищать, а рисовать персонажей два раза, перетирая под ними значения в буфере глубины, используя разные depth compare функции.

#4
22:44, 10 ноя. 2020

MAMOHT-92
1.
Они же поверх нарисуются?
Как потом контуры за стенами нарисовать?

2.
Вторым проходом можно, когда уже будут значения буфера глубины моделек. Но модельки рисуются квадами и всегда есть квады с глубиной "дальше" и возникают глюки, начинают внутренности рисоваться.

#5
(Правка: 6:05) 6:04, 11 ноя. 2020

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

#6
9:34, 11 ноя. 2020

Кстати иф можно заменить на step() или smoothstep().

#7
(Правка: 11:56) 11:56, 11 ноя. 2020

Спасибо всем!)

я в шейдерах совсем не шарю, да и во всех функция opengl, т.ч. для меня любые советы/рассуждения полезны)

Мне не очень понятна производительность шейдеров. У меня запускается, работает, а что на слабом железе? Она пропорциональна производительности видяхи или там хитрее?


romanshuvalov
> Кстати иф можно заменить на step() или smoothstep().
А это что?)

#8
12:37, 11 ноя. 2020

AWPStar
> Мне не очень понятна производительность шейдеров. У меня запускается, работает,
> а что на слабом железе?

Поставь Afterburner и сделай тесты с даунклоком.

#9
12:40, 11 ноя. 2020

AWPStar
> А это что?)

Пороговая функция. Вываливает в ответ или 0 или 1 в зависисмости от того меньше второй параметр первого или нет.

#10
(Правка: 16:58) 16:57, 11 ноя. 2020

после основного цикла отрисовки(рисуем как обычно),

делаем оверлей
1. выводим персов в рендертаргет(лучше по отдельности)
2. рендертаргет выводить с шейдером, который создает обводку

#11
20:47, 11 ноя. 2020

О, какие люди. Где тема проекта? Где подписаться?)

#12
23:20, 11 ноя. 2020

@Salamandr
Да нет пока темы и проекта) Задумка есть - с реализацией сложнее.
Модельки учусь рисовать, анимацию делать. Хотя пока "кубиками" пусть походят)

#13
22:50, 12 янв. 2021

Вопрос по теме.
Рисую я это все в текстуру. Но понадобилось еще в depth писать.
Этот самый алгоритм, только пытаюсь записать в gl_FragDepth

  float z1,z2;
  z1 = texture2D(iDstDepth, uv.xy).x;
  z2 = texture2D(iSrcDepth, uv.xy).x;
Либо z1 или z2 пишу, но ничего в результате нет.
аттачмент проверил, пытался glDisable(GL_DEPTH_TEST) ставить.
Подскажите в чем может быть дело?


Для понятности что до этого происходило.
Я рисую стены отдельно, объекты отдельно. Соединяю их шейдером с проверкой глубины.
Все хорошо, но в результате получается только текстура без глубины.

Сейчас мне поверх этого надо нарисовать еще и прозрачные объекты, с DEPTH_TEST. А без данных о глубине никак.

#14
23:27, 12 янв. 2021

AWPStar
А случайно ранее ты не зовешь glDepthMask(false)?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика