2014-10-22 3 views
0

До сих пор я делал очень простой куб, но цвета, которые я использую, являются неправильными. Если я определяю Red в моем Vertex Buffer, то есть no красный во всех точках на кубе!Отображаются неправильные цвета - Direct3D

Красный переходит в светло-зеленый

Желтый идет в Light Blue

....

Некоторые цвета, как зеленый, черный, ... являются найти, только некоторые из них !! Вот как я определяю мой Vertex Buffer (игнорировать /*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

Некоторая информация:

Vertex Состав:

struct Vertex 
{ 
    XMFLOAT3 pos; 
    XMVECTORF32 color; 
}; 

The Colours Enum от DirectXColors.h. Он использует для цветов XMVECTORF32.

Мои действительно основной Pixel Shader:

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

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

Мой Input Layout Описание:

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

Спасибо за помощь!

+0

Несколько вопросов: Как выглядит ваша структура «Vertex»? Какова ценность 'Colors :: Yellow'? Можете ли вы опубликовать код для своего пиксельного шейдера и объявления ввода макета? Какой «BufferDesc.Format» вы использовали при создании своей своп-цепи? – megadan

+0

Добавлена ​​информация! Спасибо за помощь! ; D – Rakete1111

+0

Вы можете посмотреть [DirectX Tool Kit] (https://directxtk.codeplex.com/) для некоторых примерных структур вершин с соответствующими макетами ввода ('' VertexPositionColor'') и примерными шейдерами ('' BasicEffect «и друзья». –

ответ

2

Ваш вопрос представляет собой смесь XMFLOAT3 и XMVECTORF32 в вашей конструкции Vertex, которая вставляет дополнительную прокладку в конструкцию.

XMVECTOR типы выровнены с границами 16 байт для выполнения. Это сделало бы вашу структуру Vertex 32 байтами с 1 байтовым отступом между pos и color для правильного выравнивания данных XMVECTORF32. Этот дополнительный байт заполнения отбрасывает ваш макет ввода, потому что вы сказали, что позиция составляет 12 байтов, за которыми сразу следует 16 байт, что составляет всего 28 байт.

Вы можете исправить это несколькими способами. Либо:

  1. Изменения "POSITION" во входном макете в DXGI_FORMAT_R32G32B32A32_FLOAT для учета дополнительного байта заполнения в вашей структуре. Если вы используете float4 для позиции в вашем вершинном шейдере, вам может потребоваться установить это дополнительное значение (компонент w) на 1 перед преобразованием.

  2. color в вашей структуре XMFLOAT4.

  3. Смените pos в своей структуре на XMVECTORF32 или XMFLOAT4 и сделайте # 1. Это делает прокладку не скрытой.

+1

Примечание '' XMVECTORF32'' предназначен в первую очередь для создания векторных констант. Что-то вроде: '' static const XMVECTORF32 s_1234 = {1.f, 2.f, 3.f, 4.f}; '. Это не хороший выбор в структуре данных из-за выравнивания, как указывает мегадана. –

+0

Спасибо всем! Я исправил проблемы сейчас, просто сохраняя «цвет» как XMFLOAT4 и делая функцию для преобразования XMVECTOR в XMFLOAT4 на лету! ; D Еще раз спасибо! – Rakete1111

Смежные вопросы