我正在网上运行一系列DirectX教程,并且具有以下结构:

struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag
DWORD color;        // from the D3DFVF_DIFFUSE flag
}

我对directX的基本了解使我知道颜色是由8位alpha,红色,绿色和蓝色通道组成的。

我正试图使这些 channel 向东开放。而不是多次编写以下代码(在CUSTOMVERTEX结构内):
public: int red()
{
    return (color & 0x00FF0000) >> 16;
}

我可以结合并集和结构来编写更优雅的somution,例如
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; // from the D3DFVF_XYZRHW flag

    #pragma pack(2)
    union
    {
        DWORD color;        // from the D3DFVF_DIFFUSE flag

        struct
        {
            char a;
            char r;
            char g;
            char b;
        };
    };
}

但是,这似乎没有达到预期的功能,r,g和b中的值几乎与颜色的含义相反,例如如果color为0x12345678 a = 0x78,则r = 0x56。这是一个额外的问题吗?

我还能从该解决方案中期待什么其他问题?例如从颜色成员溢出?

我想我要问的是...有没有更好的方法可以做到这一点?

最佳答案

是的,这是一个字节序问题。如果仅支持一个平台,则可以根据体系结构的字节顺序对结构成员进行布局。如果要处理多种体系结构,则需要根据字节序#define多个结构成员布局。

在我看来,结构和联合总是看起来更优雅,但按位操作是两者中更易于移植的。当我做这样的事情时,我会在我的启动代码中插入一个断言,以确保该结构在不确定的不确定性发生之前符合我期望的大小。

在C++中,您可以编写一个类来封装数据并为您执行操作。

07-24 09:47
查看更多