我正在网上运行一系列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++中,您可以编写一个类来封装数据并为您执行操作。