Странное. Смешение DXT текстур.

Все мы знаем про замечательный формат DXT1. Напомню, что формат этот кодирует блоки 4×4 пикселя, кодирует весьма простым образом. Cначала хранятся два опорных цвета в формате rgb565. Потом хранится масочка из 16 двухбитных lerp-значений. Формат простецкий, занимает всего 4 бита на пиксель, чем чертовски привлекателен.

Часто хочется смешивать несколько текстур. К примеру, по менее детальной маске, к примеру, аддитивно. Ландшафт так часто делается. Возникает дурацкая мысль…

… смешивать DXT блоки с весами, получая DXT блоки же на выходе. Референсная процедура смешения ( на little endian машинах ) может выглядеть примерно таким образом:

http://www.everfall.com/paste/id.php?tp8zhbb306f1

За код не ругать, сам знаю, что так нельзя писать.

Захотелось посмотреть, как такое смешение выглядит для текстур ландшафта. Хохма в том, что единственное железо в доме, на котором можно попробовать – это черная прелесть с линуксом. Кроме нее дома нет ничего приспособленного под 3D программирование.

Закодил, запустил – выглядит красиво. По крайней мере неожиданно. Можно сообразить очень симпатичный террейн, если на лету смешивать текстуры. A’la мегатекстура, только процедурная. Саму процедуру смешения можно сделать чертовски быстрой, ежели на SPU писать.

Скринов нету – потому что лениво дампить фреймбуфер.

  • Vlad Shcherbina

    Такое смешение может дать аццкие артефакты, если векторы tex1color2-tex1color1 и tex2color2-tex2color1 существенно различаются по направлению (например, если в одной текстуре (чёрный, белый), а в другой – (жёлтый, чёрный)). Если хотя бы упорядочить эти два цвета по яркости перед смешиванием, качество результата улучшится. Я не знаю правда, может в DXT1 оно уже и так упорядочено.
    Кстати, а откуда ограничение на little-endianness? 565 же симметрично? Или в BE весь блок будет перевёрнут?

  • IronPeter

    Если взять 565, поделить на две половинки и переставить – то может выйти забавное.

    DXT сжатие пишешь ты сам. Можешь упорядочивать цвета как хочешь. Там правда альфа интересным образом выводится, в зависимости от битовых масок и опорных цветов.

  • shodan

    Петь, а почему ты вместо тага [code] упорно пользуешься Everfall?

  • IronPeter

    Да я большие шматы кала ( тьфу, кода ) туда фигачу. Как-то некрасиво, когда текст прерывается на полстраницы – и надо мотать скроллбар.

  • Aliot

    2 Vlad.
    Dxt1 уже содержит упорядоченные цвета. Если tex1color2>tex1color1 – то DXT1 становится с 1битной альфой (0x11b черный и прозрачный).

    Ну и поправьте меня, если я не прав, но там не lerp значения в маске/
    00 – первый цвет, 01 – второй, 10 – интерполированный, 11 – интерполированный.
    т.е. если две текстуры содержат одинаковые (белый и черный) опорные цвета в блоке, и:
    00 (белый)в 1й маске, 11-(темно серый) во второй, то в результате интерполяции будет 10 (светло серый) – правильно
    00 (белый)в 1й маске, 01-(черный) во второй, то в результате интерполяции будет 01 (черный) – неправильно.
    Опорные цвета, очевидно, не изменятся.

  • IronPeter

    Не совсем так. Специальный случай – tex1color2 >= tex1color1 и “lerp” значение равно 3. Иначе нельзя было бы кодировать разные значения альфы в блоке.

  • Aliot

    Ну да.
    Просто явно напрямую нельзя интерполировать два случая color1 > color2 и color1

  • Aliot

    Чортовы теги.
    Просто явно напрямую нельзя интерполировать два случая color1 >= color2 и color1

  • Aliot

    Чортовы теги опять.
    [code]
    Просто явно напрямую нельзя интерполировать два случая color1 >= color2 и color1