SerafimArts
@SerafimArts
Senior Notepad Reader

Корректно ли определён размер блока DDS?

Потрошу формат DDS. Все заголовки любых форматов считываются корректно (в частности DXT1-5 и DX10, без проприетарных).

После считывания заголовков нужно корректно выдрать данные Mip'ов. И тут есть подозрение, что они считываются не совсем корректно.

Для DXT1 размер данных для считывания определяется по формуле width * height * 8
Для DXT3 и DXT5 размер данных для считывания определяется по формуле ((width + 3) >> 2) * ((height + 3) >> 2) * 16

Оба алгоритма (для DXT1-5) выше корректные и текстурки успешно подгружаются в OpenGL и рендерятся.

А что делать с DX10? Насколько я понимаю это просто расширенный вариант записи данных (с конкретным алгоритмом сжатия и доп.хедерами) и корректнее будет сопоставлять не fourcc размеру данных mip'а, а выводить алгоритм исходя из алгоритма сжатия, верно?

То есть:
- Для DXT1 говорить, что используется DXGI_FORMAT_BC1_UNORM
- Для DXT3 указывать DXGI_FORMAT_BC3_UNORM
- Для DXT5 указывать DXGI_FORMAT_BC5_UNORM

А уже исходя из алгоритма сжатия DXGI_FORMAT_BC[X_XXXXX] выводить формулу определения mip:
- Для DXGI_FORMAT_BC1_XXXX использовать width * height * 8
- Для DXGI_FORMAT_BC3_XXXX и DXGI_FORMAT_BC5_XXXX использовать ((width + 3) >> 2) * ((height+ 3) >> 2) * 16

Верно?

P.S. Замаппил вроде fourcc на DXGI форматы (логику взял из майкрософтовских сырцов), пока не тестил, но как-то так выглядит https://github.com/SerafimArts/DirectDrawSurface/b...
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы