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

Мультитекстурирование ландшафта большим количеством текстур

Страницы: 1 2 Следующая »
#0
9:27, 11 сен. 2021

Интересуют годные красивые методы как это сделать - допустим, должно быть на ландшафте 10 разных текстур.
С помощью одной текстуры RGBA в качестве карты наложения можно теоретически добится пяти разных текстур - четыре текстуры на четыре канала плюс остаточный процент от суммы присутствия будет на пятую текстуру.
Так же можно добится 16 текстур использую дополнительную двухканальную текстуру - по 4 бита на номер текстуры (ну или 256 текстур используя дополнительную четырехканальную текстуру.)
Есть еще другие интересные методы?


#1
(Правка: 10:51) 10:51, 11 сен. 2021

MikeNew
> С помощью одной текстуры RGBA в качестве карты наложения можно теоретически
> добится пяти разных текстур
Это если ты тупо флоаты туда запихивать будешь)))
Серьёзно, в рендере и текстуры с интами есть. А для процента и 8 бит хватит.
берёшь RGBA16ui и пишешь в канал пополам индекс материала и его процент. Уж 256 индексов тебе должно хватить.

#2
11:30, 11 сен. 2021

samrrr
> Это если ты тупо флоаты туда запихивать будешь)))
> Серьёзно, в рендере и текстуры с интами есть. А для процента и 8 бит хватит.
> берёшь RGBA16ui и пишешь в канал пополам индекс материала и его процент. Уж 256
> индексов тебе должно хватить.
Это же 16-битная четырехканальная текстура получается, 64 бита на тексель.
Она по скорости чтения будет выше чем две восьмибитные?

#3
12:22, 11 сен. 2021

MikeNew
Я в одном своём проекте использовал технику, позволяющую накладывать до 256 различных текстур.
Суть её следующая: создаётся текстура, где каждый пиксель - номер текстуры. Во фрагментном шейдере ландшафта находится клетка в этой текстуре, в углах клетки - номера текстур. По номерам текстур делаются четыре выборки из массива текстур и смешиваются по коэффициентам, зависящим от координат текущего фрагмента в выбранной клетке.

Достоинство данного подхода - поддержка большого количества текстур. Недостаток - смешивание текстур происходит только по границам клеток, нельзя задать области с плавным градиентом текстур.

#4
12:25, 11 сен. 2021

MikeNew
> можно теоретически добится пяти разных текстур - четыре текстуры на четыре
> канала плюс остаточный процент от суммы присутствия будет на пятую текстуру.
Я когда-то делал именно такую демку, только было не 5, а 10 текстур - альбедки и нормалки на каждый канал, плюс текстура-маска: https://disk.yandex.ru/d/6tyHRHKXbaoA2
Уже ощущается падение быстродействия.

#5
12:29, 11 сен. 2021

Panzerschrek[CN]
Можно загнать текстуры в одну Volume, плюс текстура с индексами слоёв. Смешивать вообще нельзя, зато производительность очень высокая.
Чтобы не было артефактов, отключаем фильтрацию текстуры маски и фильтрацию Volume по W координате.

#6
12:35, 11 сен. 2021

Mikle
> Можно загнать текстуры в одну Volume
> отключаем фильтрацию текстуры маски и фильтрацию Volume по W координате
Лучше всё-же использовать массив текстур (родная фича GAPI). Там сразу нету фильтрации между слоями и есть отдельные mip-уровни на каждый слой.

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

#7
13:22, 11 сен. 2021

MikeNew
> Это же 16-битная четырехканальная текстура получается, 64 бита на тексель.
А ты думал в сказку попал?

Хочешь красиво с переходами как в ААА играх, то придётся по 64 бита на пиксель текстурирования делать.
Конечно можно ужать до 32 бит но нафига? Там потеря качества будет такая, что ужас.  И ещё можно же разрешение текстуры текстурирования делать меньше чем разрешение текстуры карты высот.

А вообще можно генерировать эти текстуры полностью или частично. Вон посмотри как базы в elite dangerous выглядят.

А хочешь просто то либо:
1) бери готовый движок/либу
2) забудь о плавных переходах

#8
16:00, 11 сен. 2021

Так все таки, есть разница в скорости чтения из текстуры RGB16 и двух текстур RGB8 (в одном массиве)? Никто случайно не тестировал?

#9
18:18, 11 сен. 2021

MikeNew
> есть разница в скорости чтения из текстуры RGB16 и двух текстур RGB8
недавно читал, что RGBA16 быстрее двух RGBA8, потому что один кеш против двух. и трехкомпонентного формата rgb у тебя все равно на стороне железа вряд ли будет.

#10
18:22, 11 сен. 2021

MikeNew
> Так все таки, есть разница в скорости чтения из текстуры RGB16 и двух текстур RGB8 (в одном массиве)?
Есть. Но врятли кто-то знает что быстрее.

Да и не факт что на разных видюхах одинаково.
Как хочешь, так и делай. Я бы взял 1 текстуру, легче же кодить да и слотов на текстуры в опенжл конечное количество.

#11
(Правка: 12:18) 12:17, 13 сен. 2021

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

Простой террайн из треугольников, размер квада - 1.0
Изображение

В фрагментный шейдер заходит кордината "pos", которая уже используется в качеcтве UV для текстурирования ландшафта, умножая ее на размер террайна в квадах можно использовать в texelFetch.

Я так понимаю, что для первого квада заходя в фрагментный шейдер кордината "pos" интерполируется от 0 до 1.
Поэтому, чтобы получить координаты квада в фрагментом шейдере, я попробовал сделать так - беру дробную часть через от "pos" через fract.
Если эта дробная часть больше меньше чем 0.5 для x или z - значит можно просто округлить pos до меньше целого (через int() ) и я получу нужную мне координату для texelFetch.
Если дробная часть больше чем 0.5 - значит надо так же округлить до меньшего целого и отнять единицу.
Только вот это нихрена неправильно, неправильно я рассуждаю, не получается в суть интерполяции, хотя вроде все просто.
Где ошибка в моей логике?
Как мне в фрагментном шейдере получить координату квада?

#12
12:52, 13 сен. 2021

MikeNew
> умножая ее на размер террайна в квадах
а на размер текстуры не хочешь умножить ? )

#13
12:58, 13 сен. 2021

BingoBongo
> а на размер текстуры не хочешь умножить ? )
У меня это одно и то же.

#14
(Правка: 13:08) 13:07, 13 сен. 2021

MikeNew
> Как мне в фрагментном шейдере получить координату квада?

передавай uv из фрагментного шейдера в вершинный вторым аттрибутом с flat для получения id квада.
Для текстурирования передавай с обычной интерполяцией.

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