#graphics #directx #direct3d
#графика #directx #direct3d
Вопрос:
Я смотрел на WICTextureLoader.cpp файл, который является частью инструментария DirectX. И я пытаюсь понять этот фрагмент кода:
https://github.com/microsoft/DirectXTK/blob/master/Src/WICTextureLoader.cpp#L530
// Allocate temporary memory for image
uint64_t rowBytes = (uint64_t(twidth) * uint64_t(bpp) 7u) / 8u;
uint64_t numBytes = rowBytes * uint64_t(theight);
Я понимаю, что вам нужно будет выделить ширину текстуры * бит на пиксель для одной строки текстуры. Но я не понимаю добавления 7 на пиксель, а затем деления всего на 8. О чем это?
Комментарии:
1. Это гарантирует, что количество строк в байтах делится на 8 и может содержать twidth * bpp.
2. @SimonMourier Хорошо, спасибо. Но почему так важно, чтобы пространство, выделенное в системной памяти для пиксельных данных, было кратно 8?
3. Это задокументировано здесь: docs.microsoft.com/en-us/windows/win32/api/wincodec / … шаг / шаг выровнен по некоторой границе (4, 8 и т.д.), Вот причина, по которой он вообще существует: docs.microsoft.com/en-us/windows/win32/medfound/image-stride
4. @SimonMourier Спасибо. Кроме того, я думаю, поскольку они выполняют биты на пиксель, а не байты, я полагаю, это также было бы необходимо, поскольку вы не можете выделить меньше байта.
Ответ №1:
bpp
вот «биты на пиксель». Выражение округляется до следующего целого байта (8 бит).
Это классический шаблон C для «выравнивания» для выравнивания по степени 2, здесь выраженный как шаблон C .
template<typename T>
inline T AlignUp(T size, size_t alignment) noexcept
{
if (alignment > 0)
{
assert(((alignment - 1) amp; alignment) == 0);
auto mask = static_cast<T>(alignment - 1);
return (size mask) amp; ~mask;
}
return size;
}
Вместо / 8
этого я мог бы использовать битовые операторы (опять же, поскольку это степень двойки) и готово amp; ~8
, но / 8
кажется более понятным.