2013-12-08 33 views
2

我在使用Direct3D时遇到了一些问题。即顶点缓冲区和它的ByteWidth成员。D3D11_BUFFER_DESC bytewidth“not working”

我要画两个四边形,所以我创造我的顶点缓冲区像这样:

struct Vertex 
{ 
    XMFLOAT3 pos; 
    XMFLOAT3 normal; 
    XMFLOAT2 texCoord; 
}; 

    .... 

void GameWindow::CreateVerticesAndBuffer() 
{ 
    Vertex vertices[] = 
    { 
     { XMFLOAT3(-1.0f, -1.0f, -1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(0.0f, 1.0f) }, 
     { XMFLOAT3(-1.0f, 1.0f, -1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(0.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, -1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(1.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, -1.0f, -1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(1.0f, 1.0f) }, 

     { XMFLOAT3(-1.0f, -1.0f, 1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(0.0f, 1.0f) }, 
     { XMFLOAT3(-1.0f, 1.0f, 1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(0.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, 1.0f, 1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(1.0f, 0.0f) }, 
     { XMFLOAT3(1.0f, -1.0f, 1.0f), XMFLOAT3(0.0f, 0.0f, -1.0f), XMFLOAT2(1.0f, 1.0f) } 
    }; 

    D3D11_BUFFER_DESC desc; 
    ZeroMemory(&desc, sizeof(desc)); 
    desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    desc.CPUAccessFlags = 0; 
    desc.Usage = D3D11_USAGE_DEFAULT; //Will not ever change after creation (??) 
    desc.MiscFlags = 0; 
    desc.ByteWidth = sizeof(Vertex) * 8; 
    desc.StructureByteStride = 0; 

    D3D11_SUBRESOURCE_DATA data; 
    ZeroMemory(&data, sizeof(data)); 
    data.pSysMem = vertices; 

    HR(device->CreateBuffer(
     &desc, 
     &data, 
     &vertexBuffer)); 

    UINT stride = sizeof(Vertex); 
    UINT offset = 0; 
    deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); 
} 

这段代码产生一些奇怪的结果看到here。由于某种原因,背面被镜像。

但是,如果我改变

desc.ByteWidth = sizeof(Vertex) * 8

desc.ByteWidth = sizeof(Vertex) * 9

这是drawn correctly

有没有人有任何想法,为什么会发生这种情况?

编辑:这是我的CreateInputLayout:

D3D11_INPUT_ELEMENT_DESC inputDesc[] = { 
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    { "TEX", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 } 
}; 

hRes = device->CreateInputLayout(
    inputDesc, 
    ARRAYSIZE(inputDesc), 
    vertexShaderSource->GetBufferPointer(), 
    vertexShaderSource->GetBufferSize(), 
    &vertexInputLayout); 
+0

@ItzWarty为什么你认为这是C++/CLI?这里没有任何东西不是纯粹的C++。 – Trillian

+0

@ItzWarty:StructureByteStride用于将结构化数据传递给着色器,而不是用于顶点缓冲区。 – Trillian

+0

@Semicolon:你可以发布你的CreateInputLayout调用吗? – Trillian

回答

3

您指定DXGI_FORMAT_R32G32B32_FLOAT(FLOAT3)为您的TEX成员。将其更改为DXGI_FORMAT_R32G32_FLOAT,它应该可以工作。