Предположим, есть 4 текстуры(трава, земля, песок и т.д) и ещё одна текстура где красный канал обозначает прозрачность первой текстуры, зеленый канал - прозрачность второй, синий - третей и альфа - четвертой. Дальше через шейдер(которому мы передаем все 5 текстур) рисуем модельку ландшафта.
нет, 16 конечно не нужно, одновременно в одном месте ты все равно 64 текстуры никак не смешаешь если ограничить это число 4, то тебе достаточно 2 управляющие текстуры: в первой хранятся 4 индекса (0-255) текстур с наибольшим весом, а во второй собственно их веса
Хм, хорошо, спасибо. Ещё один вопрос, можно ли как то передать в шейдер все текстуры как массив? Без массива придётся строчить кучу if else if else if...
UPD сразу не заметил что тема про GMS, там может и не поддерживается, но по идее должно, фича нужная и достаточно старая уже если все же нет — можно просто сгенерировать нужный код (обьявление текстур, if else if else и тд) каким-нибудь скриптом
Сообщение отредактировал drcrack - Воскресенье, 09 Февраля 2020, 07:54
Скорее всего. Если в шейдере использовать texture2DArray/sampler2DArray, то он вообще не запускается. Если писать sampler2D s_Texs[64]; то вроде бы работает, но из самого гамака текстуры не передаются.
Quad69, нет, 64 текстуры за один проход - зверство. Ты можешь сделать по-другому: Воспринимай глобальную текстуру ландшафта как слоеный пирог (сюрфейс). И вот на каждую текстуру иметь иметь свою маску. И потом просто можешь лепить этот пирог из (в теории) неограниченного колличества слоев и отрисовывать на сюрфейсе. Этот способ не ультра быстрый, но вполне рабочий. + Это позволит тебе один раз отрисовать до невозможности сложную текстуру и больше не напрягать видеокарту, т.к. ты по факту рендеришь в сюрфейс для многоразового использования.
Сообщение отредактировал martuk - Воскресенье, 09 Февраля 2020, 18:32
если ограничить это число 4, то тебе достаточно 2 управляющие текстуры: в первой хранятся 4 индекса (0-255) текстур с наибольшим весом, а во второй собственно их веса
Раз уж зарегался, скажу - текстуру с индексами семплить обычным образом нельзя. Т.к. индексы в отличии от весов не интерполируются корректно (например у пикселя 1 текстуры индекс 1 у пикселя 2 текстуры мндекс 3, в результате мипмапинга получишь усреднённый индекс 2) Таким образом текстуру надо семплить только первого мип уровня , в результате чего будет кипение на стыках материалов, особенно на дальнем плане
Добавлено (20 Февраля 2020, 12:39) --------------------------------------------- возможно есть вариант ручками посчитать мип уровни текстуры используя макс фильтр и семплить только целочисленные мипр уровни Это гемор
Сообщение отредактировал puksus4 - Четверг, 20 Февраля 2020, 12:39