Потрошу формат 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...