【问题标题】:Allocating memory for a texture为纹理分配内存
【发布时间】:2021-04-03 15:44:57
【问题描述】:

我一直在查看作为 DirectX 工具包一部分的 WICTextureLoader.cpp 文件。我正在尝试理解这段代码:

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。那是什么意思?

【问题讨论】:

  • 它确保 rowBytes 可以被 8 整除,并且可以包含 twidth * bpp。
  • @SimonMourier 好的,谢谢。但是为什么在系统内存中为像素数据分配的空间是 8 的倍数很重要呢?
  • 这在此处记录:docs.microsoft.com/en-us/windows/win32/api/wincodec/… 间距/步幅在某个边界(4、8 等)上对齐,这就是它存在的原因:docs.microsoft.com/en-us/windows/win32/medfound/image-stride
  • @SimonMourier 谢谢。我也猜想因为他们是按像素而不是字节做位,我想这也是必要的,因为你不能分配少于一个字节。

标签: graphics directx direct3d


【解决方案1】:

bpp 这里是“每像素位数”。表达式将向上四舍五入到下一个完整字节(8 位)。

这是一个经典的 C 模式,用于“对齐”以进行 2 的幂对齐,这里表示为 C++ 模板。

    template<typename T>
    inline T AlignUp(T size, size_t alignment) noexcept
    {
        if (alignment > 0)
        {
            assert(((alignment - 1) & alignment) == 0);
            auto mask = static_cast<T>(alignment - 1);
            return (size + mask) & ~mask;
        }
        return size;
    }

我可以使用位运算符代替/ 8(同样,因为它是2 的幂)并使用&amp; ~8,但/ 8 似乎更清晰。

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    相关资源
    最近更新 更多