2014-10-22 3 views
0

지금까지 아주 기본적인 큐브를 만들었지 만 사용하는 색이 잘못되었습니다. 내 버텍스 버퍼에 빨간색을 정의하면 아니요 큐브의 모든 위치에 빨간색이 있습니다!잘못된 색이 표시됨 - Direct3D

빨간색

노란색 라이트 블루

....

그린, 블랙 등의 일부 색상, ... 찾을 수 있습니다 간다 녹색 빛에 간다, 단지 그들 중 일부! 은 여기 내 버텍스 버퍼가 정의하는 방법 (무시 /*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; 
}; 

색상 열거 형은 DirectXColors.h입니다. 색상은 XMVECTORF32입니다.

내 정말 기본적인 픽셀 쉐이더 :

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.FormatDXGI_FORMAT_R8G8B8A8_UNORM의 값을 가지고

감사합니다!

+0

몇 가지 질문 : 'Vertex' 구조는 어떻게 생겼습니까? 'Colors :: Yellow'의 가치는 무엇입니까? 픽셀 쉐이더 및 입력 레이아웃 선언을위한 코드를 게시 할 수 있습니까? 스왑 체인을 만들 때 어떤'BufferDesc.Format'을 사용 했습니까? – megadan

+0

정보를 추가했습니다! 도와 주셔서 감사합니다! ; D – Rakete1111

+0

일치하는 입력 레이아웃 (''VertexPositionColor'') 및 예제 쉐이더 (''BasicEffect (''VertexPositionColor'') 예제)에 대해서는 [DirectX Tool Kit] (https://directxtk.codeplex.com/) ''와 친구들). –

답변

2

Vertex 구조에 XMFLOAT3XMVECTORF32이 섞여있어 여분의 패딩이 구조에 삽입되어 있습니다.

XMVECTOR 유형은 성능을 위해 16 바이트 경계에 정렬됩니다. 이렇게하면 과 color 사이에 1 바이트 패딩이있는 Vertex 구조가 32 바이트 구조로되어 XMVECTORF32 데이터를 올바르게 정렬 할 수 있습니다. 추가 바이트의 패딩은 입력 레이아웃을 포기합니다. 위치가 12 바이트이고 곧바로 28 바이트 인 16 바이트가 나오기 때문입니다.

몇 가지 방법으로 해결할 수 있습니다. 다음 중 하나를 DXGI_FORMAT_R32G32B32A32_FLOAT로 입력 레이아웃

  1. 변경 "POSITION"은 구조 패딩의 추가 바이트를 차지합니다. 버텍스 셰이더의 위치에 float4을 사용하는 경우 변형하기 전에이 추가 값 (w 구성 요소)을 1로 설정해야 할 수도 있습니다.

  2. 구조의 colorXMFLOAT4으로 변경하십시오.

  3. 구조의 posXMVECTORF32 또는 XMFLOAT4으로 변경하고 # 1을 수행하십시오. 이렇게하면 패딩이 숨겨지지 않습니다.

+1

참고 "XMVECTORF32"는 주로 벡터 상수를 생성하기위한 것입니다. 뭔가 :''정적 const XMVECTORF32 s_1234 = {1.f, 2.f, 3.f, 4.f}; 메가 단 (megadan)이 나타내는 것처럼 정렬 때문에 데이터 구조에서 좋은 선택이 아닙니다. –

+0

모두에게 감사드립니다! XMFLOAT4로'color'를 저장하고 즉시 XMVECTOR를 XMFLOAT4로 변환하는 함수를 작성하여 문제를 해결했습니다! D 다시 고마워! – Rakete1111