2015-01-31 4 views
1

위치를 저장하는 버퍼와 색만 저장하는 2 개의 정점 버퍼를 만들려고합니다. 이것은 프랭크 루나 (Frank Luna)의 책에서 버텍스 설명, 레이아웃 및 버퍼 옵션에 익숙해지기위한 연습 일뿐입니다. 문제는 필자가 모든 관련 변경 사항을 적용한 것처럼 느껴지고 형상을 표시하려고해도 색상 버퍼가 작동하지 않는다는 것입니다. 연습을 완료하려면 각 Vertex가 위치와 색상을 저장하는 예제 코드에서 책의 Vertex vertices [] = {{...}, {...}, ...} 대신 XMFLOAT3을 사용하고 있습니다. 위치 및 XMFLOAT4 색상 [] = {a, b, c, ...}에 대해 pos [] = {x, y, z ...}. I는 대신 이전에 기초한 자원이었다 단지 mBoxVB 두 정점 버퍼를 기대하는 장치에 정점 버퍼를 변경 한Direct3D 다중 정점 버퍼, 비 인터리브 요소

D3D11_INPUT_ELEMENT_DESC vertexDesc[] = 
    { 
     {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, 
     {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0} 
    }; 

: I는 각 요소는 정확한 입력 지점을 참조하도록, 정점 정보를 수정 정점 정점 [] :

ID3D11Buffer* mBoxVB; 
ID3D11Buffer* mBoxVBCol; 
ID3D11Buffer* combined[2]; 
... 
combined[0]=mBoxVB; 
combined[1]=mBoxVBCol; 
... 
UINT stride[] = {sizeof(XMFLOAT3), sizeof(XMFLOAT4)}; 
UINT offset = 0; 
md3dImmediateContext->IASetVertexBuffers(0, 2, combined, stride, &offset); 

도움의 경우,이 버퍼 생성 코드이다

D3D11_BUFFER_DESC vbd; 
    vbd.Usage = D3D11_USAGE_IMMUTABLE; 
    vbd.ByteWidth = sizeof(XMFLOAT3)*8; 
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    vbd.CPUAccessFlags = 0; 
    vbd.MiscFlags = 0; 
    vbd.StructureByteStride = 0; 

    D3D11_SUBRESOURCE_DATA vinitData; 
    vinitData.pSysMem = Shapes::boxEx1Pos; 
    HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mBoxVB)); 

    D3D11_BUFFER_DESC cbd; 
    vbd.Usage = D3D11_USAGE_IMMUTABLE; 
    vbd.ByteWidth = sizeof(XMFLOAT4)*8; 
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    vbd.CPUAccessFlags = 0; 
    vbd.MiscFlags = 0; 
    vbd.StructureByteStride = 0; 

    D3D11_SUBRESOURCE_DATA cinitData; 
    cinitData.pSysMem = Shapes::boxEx1Col; 
    HR(md3dDevice->CreateBuffer(&vbd, &cinitData, &mBoxVBCol)); 

I 조합 사용하면 [0] = mBoxVBCol 대신 콤비 ned [0] = mBoxVB 다른 모양이있어서 거기에 데이터가 있다는 것을 알았지 만 Color 요소가 버텍스 쉐이더로 전송되지 않는 이유를 모르겠습니다. 두 번째 슬롯이 무시되고있는 것처럼 보입니다. 수술 중.

+0

쉐이더 소스도 게시 할 수 있습니까? – PDizzle745

+0

지연 시간 동안 미안 하나의 버텍스 버퍼를 사용할 때 셰이더가 정상적으로 작동했습니다. 문제를 발견하고 게시했습니다. –

답변

1

문제점에 대한 해결책을 찾았습니다. 두 버퍼에 대한 스트라이드 배열을 지정하고 있었지만 한 오프셋 만 지정 했으므로 UINT 오프셋 = 0으로 변경했습니다. ~ UINT offset [] = {0,0}; 그것은 효과가 있었다.

관련 문제