C++ DXGI_格式代码如何与endianness相关?

C++ DXGI_格式代码如何与endianness相关?,c++,direct3d,endianness,dxgi,C++,Direct3d,Endianness,Dxgi,我一直在阅读Frank D.Luna的书“DirectX 10 3D编程入门”,其中一个问题是如何从使用 D3DXCOLOR颜色(128位) 到 UINT颜色(32位) 大概要使用的格式代码是:DXGI_format_R8G8B8A8_UNORM 在我看来,这意味着你有一个变量,它在字节级别上以精确的顺序包含有关通道的信息:RGBA(这是正确的解释吗?--因为我确信我已经读到,当你想要RGBA时,你真的需要一个像:a#R#G#B#这样的代码,首先指定alpha通道 无论如何,我选择了(可能有更好

我一直在阅读Frank D.Luna的书“DirectX 10 3D编程入门”,其中一个问题是如何从使用

D3DXCOLOR颜色(128位)
到 UINT颜色(32位)

大概要使用的格式代码是:DXGI_format_R8G8B8A8_UNORM

在我看来,这意味着你有一个变量,它在字节级别上以精确的顺序包含有关通道的信息:RGBA(这是正确的解释吗?--因为我确信我已经读到,当你想要RGBA时,你真的需要一个像:a#R#G#B#这样的代码,首先指定alpha通道

无论如何,我选择了(可能有更好的方法)这样做:

定义白色时:
constd3dxcolor白色(1.0f,1.0f,1.0f,1.0f);
此强制转换在D3DXCOLOR的扩展中定义

但是,当DXGI_FORMAT_R8G8B8A8_UNORM与UINT color变量一起使用时,会得到错误的结果。Luna将此归因于endianness

这是因为D3DXCOLOR的强制转换生成RGBA形式的UINT,但因为intel x86使用了little endiann,那么在字节级别,您真的得到了“ABGR”?因此,当这个变量实际被解释时,着色器看到的是ABGR而不是RGBA?在解释字节时,它不应该只知道高阶位位于较小的地址吗?
最后一个问题:既然代码被指定为DXGI_FORMAT_r8g8ba8_UNORM,这是否意味着R应该是最小的地址,A应该是最大的地址?我确信我有很多误解,所以请随意消除它们。

当您使用“UINT color=(UINT)WHITE”语句时它正在调用D3DXCOLOR运算符DWORD()转换。由于传统D3DX9Math是为Direct3D 9设计的,因此这是一种BGRA颜色(相当于DXGI的DXGI_格式_B8G8R8A8_UNORM)。来自D3DX9Math.inl:

D3DXINLINE
D3DXCOLOR::D3DXCOLOR( DWORD dw )

{
    CONST FLOAT f = 1.0f / 255.0f;
    r = f * (FLOAT) (unsigned char) (dw >> 16);
    g = f * (FLOAT) (unsigned char) (dw >>  8);
    b = f * (FLOAT) (unsigned char) (dw >>  0);
    a = f * (FLOAT) (unsigned char) (dw >> 24);
}
由于DXGI的原始Direct3D 10版本(v1.0)未定义DXGI_格式_B8G8R8A8_UNORM(它是与DXGI 1.1一起添加的),因此Direct3D 10+使用的“默认”颜色为RGBA

所有DXGI格式都是小端格式,因为这适用于所有Direct3D 10+Microsoft平台。对于Xbox 360,引入了一些特殊的Direct3D 9 D3D格式的大端版本,但这并不是真正的工作。问题更基本:BGRA和RGBA都是有效的选项,但Direct3D 9首选BGRA和Direct3D 10+首选RGBA


为了让事情变得更加混乱,DXGI颠倒了Direct3D 9 D3DFMT颜色的命名约定。“D3DFMT_A8R8G8B8”与“DXGI_格式_B8G8R8A8_UNORM”是同一回事。请参阅上的此主题。历史上,Windows graphics将其称为“32位ARGB”格式,但更自然的描述方式是“BGRA”

D3DXINLINE
D3DXCOLOR::D3DXCOLOR( DWORD dw )

{
    CONST FLOAT f = 1.0f / 255.0f;
    r = f * (FLOAT) (unsigned char) (dw >> 16);
    g = f * (FLOAT) (unsigned char) (dw >>  8);
    b = f * (FLOAT) (unsigned char) (dw >>  0);
    a = f * (FLOAT) (unsigned char) (dw >> 24);
}
由于DXGI的原始Direct3D 10版本(v1.0)未定义DXGI_格式_B8G8R8A8_UNORM(它是与DXGI 1.1一起添加的),因此Direct3D 10+使用的“默认”颜色为RGBA

所有DXGI格式都是小端格式,因为这适用于所有Direct3D 10+Microsoft平台。对于Xbox 360,引入了一些特殊的Direct3D 9 D3D格式的大端版本,但这并不是真正的工作。问题更基本:BGRA和RGBA都是有效的选项,但Direct3D 9首选BGRA和Direct3D 10+首选RGBA


为了让事情变得更加混乱,DXGI颠倒了Direct3D 9 D3DFMT颜色的命名约定。“D3DFMT_A8R8G8B8”与“DXGI_格式_B8G8R8A8_UNORM”是同一回事。请参阅上的此主题。历史上,Windows graphics将其称为“32位ARGB”格式,但更自然的描述方式是“BGRA”.

这里有一个链接,可以链接到gamedev.net上的同一篇文章,供好奇者阅读:这里有一个链接,可以链接到gamedev.net上的同一篇文章,供好奇者阅读: