显示错误的颜色 - Direct3D

时间:2014-10-22 18:18:33

标签: directx rendering direct3d directx-11

到目前为止,我制作了一个非常基本的立方体,但我使用的颜色是错误的。如果我在我的顶点缓冲区中定义红色,那么立方体上任何地方都有 no 红色!

红色进入浅绿色

黄色转向浅蓝色

...

可以找到一些颜色,如绿色,黑色......,只是其中一些!! 以下是我定义顶点缓冲区的方法(忽略/*UV Coords*/

Vertex vertices[] = 
    {
        //Front face vertices
        { XMFLOAT3(-1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, +1.0f, +1.0f), /*XMFLOAT2(1.0f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, -1.0f, +1.0f), /*XMFLOAT2(1.0f, 1.0f)*/ Colors::Yellow },
        //Back face vertices
        { XMFLOAT3(-1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, +1.0f, -1.0f), /*XMFLOAT2(1.0f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, -1.0f, -1.0f), /*XMFLOAT2(1.0f, 1.0f)*/ Colors::Yellow },
        //Right face vertices
        { XMFLOAT3(+1.0f, +1.0f, -1.0f), /*XMFLOAT2(1.0f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, -1.0f, -1.0f), /*XMFLOAT2(1.0f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
        //Left face vertices
        { XMFLOAT3(-1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.0f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.0f, 1.0f)*/ Colors::Yellow },
        //Top face vertices
        { XMFLOAT3(+1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, +1.0f, -1.0f), /*XMFLOAT2(0.0f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, +1.0f, +1.0f), /*XMFLOAT2(0.0f, 0.0f)*/ Colors::Yellow },
        //Bottom face vertices
        { XMFLOAT3(+1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.5f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, -1.0f, -1.0f), /*XMFLOAT2(0.0f, 1.0f)*/ Colors::Yellow },
        { XMFLOAT3(+1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.5f, 0.0f)*/ Colors::Yellow },
        { XMFLOAT3(-1.0f, -1.0f, +1.0f), /*XMFLOAT2(0.0f, 0.0f)*/ Colors::Yellow }
    };

这里我只测试黄色,结果如下: enter image description here

一些信息:

顶点结构:

struct Vertex
{
    XMFLOAT3 pos;
    XMVECTORF32 color;
};

Colors Enum来自DirectXColors.h。它用于颜色XMVECTORF32

我非常基本的Pixel Shader:

struct PixelIN
{
    float4 pos : SV_POSITION;
    float4 color : COLOR;
};

float4 main(PixelIN i) : SV_TARGET
{
    return i.color;
}

我的输入布局说明:

D3D11_INPUT_ELEMENT_DESC ie[] = {
            { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
            { "COLOR", 0,  DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}
    };

BufferDesc.Format的值为DXGI_FORMAT_R8G8B8A8_UNORM

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您的问题在XMFLOAT3结构中混合了XMVECTORF32Vertex,这会在结构中插入额外的填充。

XMVECTOR类型与16字节边界对齐以提高性能。这将使Vertex结构为32个字节,在poscolor之间填充1个字节,以正确对齐XMVECTORF32数据。填充的额外字节会抛弃输入布局,因为您已经说过位置是12个字节,紧接着是16个字节,只有28个字节。

你可以通过几种方式解决这个问题。之一:

  1. 将输入布局中的"POSITION"更改为DXGI_FORMAT_R32G32B32A32_FLOAT,以说明结构中填充的额外字节。如果在顶点着色器中使用float4作为位置,则可能需要在转换前将此额外值(w分量)设置为1.

  2. 将结构中的color更改为XMFLOAT4

  3. 将结构中的pos更改为XMVECTORF32XMFLOAT4并执行#1。这样就不会隐藏填充。