Graphics 为纹理分配内存

Graphics 为纹理分配内存,graphics,directx,direct3d,Graphics,Directx,Direct3d,我一直在看作为DirectX工具包一部分的WICTextureLoader.cpp文件。我试图理解这段代码: 我知道您需要为一行纹理分配纹理宽度*位/像素。但我不明白每像素加7,然后除以8。这是怎么回事?bpp这里是“每像素位”。表达式向上取整到下一个整字节(8位) 这是一个经典的C模式,用于“幂对齐”的2个对齐,这里用C++模板表示。 template<typename T> inline T AlignUp(T size, size_t alignment) n

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

我知道您需要为一行纹理分配纹理宽度*位/像素。但我不明白每像素加7,然后除以8。这是怎么回事?

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;
    }
模板
内联T对齐(T大小、大小\u T对齐)无例外
{
如果(对齐>0)
{
断言(((对齐-1)和对齐)==0);
自动遮罩=静态投影(对齐-1);
返回(大小+掩码)和~掩码;
}
返回大小;
}

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

它确保行字节可以被8整除,并且可以包含twidth*bpp。@SimonMourier好的,谢谢。但是为什么在系统内存中为像素数据分配的空间是8的倍数很重要呢?这里记录了这一点:音高/步幅在某个边界上对齐(4、8等),这就是它存在的原因:@SimonMourier谢谢。另外,我猜,因为他们是每像素比特数而不是字节数,我想这也是必要的,因为你不能分配少于一个字节。
    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;
    }