2017-07-22 1 views
1

Ich habe versucht, die Grundlagen der DirectX 11 Programmierung mit dem MSDN tutorial05 Beispielcode zu lernen, und ich bin auf ein Problem gestoßen, ich kann keine Lösung für das Internet finden könnte sowieso sehen). Im Grunde versuche ich, ein Spielerwürfelobjekt mit Benutzereingaben und pyramidenähnliche Objekte, die der Spieler sammeln muss, zu zeichnen und zu rendern.Wie zeichne/rendere verschiedene Formen in DirectX 11

Mein Problem ist, dass, wenn ich die Szene rendere, nur die Würfel Vertex (und Indizes) Daten gelesen werden, so dass alle Objekte Würfel sind, wenn sie nicht sein sollten.

Dies ist die Funktion, wo die Vertexdaten gemacht wird:

PyramidVertex Pyramid[] = 
{ 
    // Square base of the pyramid 
    { XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, 
    { XMFLOAT3(0.5f, -0.5f, 0.5f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, 
    { XMFLOAT3(0.5f, -0.5f, -0.5f), XMFLOAT4(0.0f, 1.0f, 1.0f, 1.0f) }, 

    // The tip of the pyramid 
    { XMFLOAT3(0.0f, 0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, 
}; 
D3D11_BUFFER_DESC bdP; 
ZeroMemory(&bdP, sizeof(bdP)); 
bdP.Usage = D3D11_USAGE_DEFAULT; 
bdP.ByteWidth = sizeof(PyramidVertex) * 5; 
bdP.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
bdP.CPUAccessFlags = 0; 
D3D11_SUBRESOURCE_DATA InitPData; 
ZeroMemory(&InitPData, sizeof(InitPData)); 
InitPData.pSysMem = Pyramid; 
hr = g_pd3dDevice->CreateBuffer(&bdP, &InitPData, &g_pVertexBufferP); 
if (FAILED(hr)) 
    return hr; 

// Set vertex buffer 
UINT pStride = sizeof(PyramidVertex); 
UINT pOffset = 1; 
g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBufferP, &pStride, &pOffset); 

// create the index buffer 
DWORD pIndex[] = 
{ 
    0, 2, 1,  
    1, 2, 3, 
    0, 1, 4,  
    1, 3, 4, 
    3, 2, 4, 
    2, 0, 4, 
}; 

// create the index buffer 
bdP.Usage = D3D11_USAGE_DYNAMIC; 
bdP.ByteWidth = sizeof(DWORD) * 18; 
bdP.BindFlags = D3D11_BIND_INDEX_BUFFER; 
bdP.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
bdP.MiscFlags = 0; 
InitPData.pSysMem = pIndex; 
hr = g_pd3dDevice->CreateBuffer(&bdP, &InitPData, &g_pIndexBufferP); 
if (FAILED(hr)) 
    return hr; 

// Set index buffer 
g_pImmediateContext->IASetIndexBuffer(g_pIndexBufferP, DXGI_FORMAT_R16_UINT, 0); 

// Set primitive topology 
g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 


// Create vertex buffer 
SimpleVertex vertices[] = 
{ 
    { XMFLOAT3(-1.0f, 1.0f, -1.0f), XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(1.0f, 1.0f, -1.0f), XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(1.0f, 1.0f, 1.0f), XMFLOAT4(0.0f, 1.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(-1.0f, 1.0f, 1.0f), XMFLOAT4( .0f, 1.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(-1.0f, -1.0f, -1.0f), XMFLOAT4 (1.0f, 1.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(1.0f, -1.0f, -1.0f), XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(1.0f, -1.0f, 1.0f), XMFLOAT4( 0.0f, 1.0f, 1.0f, 1.0f) }, 
    { XMFLOAT3(-1.0f, -1.0f, 1.0f), XMFLOAT4(.0f, 1.0f, 1.0f, 1.0f) }, 
}; 
D3D11_BUFFER_DESC bd; 
ZeroMemory(&bd, sizeof(bd)); 
bd.Usage = D3D11_USAGE_DEFAULT; 
bd.ByteWidth = sizeof(SimpleVertex) * 8; 
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
bd.CPUAccessFlags = 0; 
D3D11_SUBRESOURCE_DATA InitData; 
ZeroMemory(&InitData, sizeof(InitData)); 
InitData.pSysMem = vertices; 
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer); 
if(FAILED(hr)) 
    return hr; 

// Set vertex buffer 
UINT stride = sizeof(SimpleVertex); 
UINT offset = 0; 
g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); 

// Create index buffer 
WORD indices[] = 
{ 
    3,1,0, 
    2,1,3, 

    0,5,4, 
    1,5,0, 

    3,4,7, 
    0,4,3, 

    1,6,5, 
    2,6,1, 

    2,7,6, 
    3,7,2, 

    6,4,5, 
    7,4,6, 
}; 
bd.Usage = D3D11_USAGE_DEFAULT; 
bd.ByteWidth = sizeof(WORD) * 36;  // 36 vertices needed for 12 triangles in a triangle list 
bd.BindFlags = D3D11_BIND_INDEX_BUFFER; 
bd.CPUAccessFlags = 0; 
InitData.pSysMem = indices; 
hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer); 
if(FAILED(hr)) 
    return hr; 

// Set index buffer 
g_pImmediateContext->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0); 

// Set primitive topology 
g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 


// Create the constant buffer 
bd.Usage = D3D11_USAGE_DEFAULT; 
bd.ByteWidth = sizeof(ConstantBuffer); 
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
bd.CPUAccessFlags = 0; 
hr = g_pd3dDevice->CreateBuffer(&bd, nullptr, &g_pConstantBuffer); 
if(FAILED(hr)) 
    return hr; 

// Create the constant buffer 
bdP.Usage = D3D11_USAGE_DEFAULT; 
bdP.ByteWidth = sizeof(ConstantBuffer); 
bdP.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
bdP.CPUAccessFlags = 0; 
hr = g_pd3dDevice->CreateBuffer(&bdP, nullptr, &g_pConstantBufferP); 
if (FAILED(hr)) 
    return hr; 

// Initialize the world matrix 
g_Player = XMMatrixIdentity(); 

for (int i = 0; i < 10; ++i) 
{ 
    g_Shapes[i] = XMMatrixIdentity(); 
} 

// Initialize the view matrix 
XMVECTOR Eye = XMVectorSet(0.0f, 1.0f, -5.0f, 0.0f); 
XMVECTOR At = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); 
XMVECTOR Up = XMVectorSet(0.0f, 4.0f, 0.0f, 0.0f); 
g_View = XMMatrixLookAtLH(Eye, At, Up); 

// Initialize the projection matrix 
g_Projection = XMMatrixPerspectiveFovLH(XM_PIDIV2, width/(FLOAT)height, 0.01f, 100.0f); 

ich, dass die Frage glauben, irgendwo hier ist und meine Theorie ist, dass die Pyramide g_pImmediateContext überschrieben wird, wenn es um die Erstellung der Würfel kommt. Wenn dies der Fall ist, habe ich keine Ahnung, wie ich dieses Problem lösen oder erforschen kann. Ich habe eine Stunde gebraucht, um herauszufinden, wie ich meinen Code richtig auf diese Seite schreiben kann, aber ich habe seltsame Ergebnisse erhalten. Daher werde ich einen Link zu meinem Code Google Drive mit diesem Code hinterlassen, wenn jemand (aus welchen Gründen auch immer) einen gründlichen Look haben möchte Code.

Dies ist die Funktion machen:

// 
// Clear the back buffer 
// 
g_pImmediateContext->ClearRenderTargetView(g_pRenderTargetView, Colors::Black); 

// 
// Clear the depth buffer to 1.0 (max depth) 
// 
g_pImmediateContext->ClearDepthStencilView(g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); 

XMMATRIX mRotate = XMMatrixRotationZ(DXGame->playerUser->getRotation()); 
XMMATRIX mTranslate = XMMatrixTranslation(DXGame->playerUser->getXpos(), DXGame->playerUser->getYpos(), DXGame->playerUser->getZpos()); 
XMMATRIX mScale = XMMatrixScaling(0.7f, 0.7f, 0.7f); 
g_Player = mScale * mRotate * mTranslate; 

ConstantBuffer cb1; 
cb1.mWorld = XMMatrixTranspose(g_Player); 
cb1.mView = XMMatrixTranspose(g_View); 
cb1.mProjection = XMMatrixTranspose(g_Projection); 
g_pImmediateContext->UpdateSubresource(g_pConstantBuffer, 0, nullptr, &cb1, 0, 0); 

g_pImmediateContext->VSSetShader(g_pVertexShader, nullptr, 0); 
g_pImmediateContext->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); 
g_pImmediateContext->PSSetShader(g_pPixelShader, nullptr, 0); 
g_pImmediateContext->DrawIndexed(36, 0, 0); 


for (int i = 0; i < 10; i++) 
{ 
    XMMATRIX sRotate = XMMatrixRotationY((DXGame->pickUps[i].rotation += 0.001f)); 
    XMMATRIX sTranslate = XMMatrixTranslation(DXGame->pickUps[i].xPos, DXGame->pickUps[i].yPos, DXGame->pickUps[i].zPos); 
    XMMATRIX sScale = XMMatrixScaling(0.2f, 0.2f, 0.2f); 

    g_Shapes[i] = sScale * sRotate * sTranslate;   

    ConstantBuffer constB; 
    constB.mWorld = XMMatrixTranspose(g_Shapes[i]); 
    constB.mView = XMMatrixTranspose(g_View); 
    constB.mProjection = XMMatrixTranspose(g_Projection); 
    g_pImmediateContext->UpdateSubresource(g_pConstantBufferP, 0, nullptr, &constB, 0, 0); 

    g_pImmediateContext->VSSetShader(g_pVertexShader, nullptr, 0); 
    g_pImmediateContext->VSSetConstantBuffers(0, 1, &g_pConstantBufferP); 
    g_pImmediateContext->PSSetShader(g_pPixelShader, nullptr, 0); 
    g_pImmediateContext->DrawIndexed(18, 0, 0); 
} 

g_pSwapChain->Present(0, 0); 

Etwas, das ich auch bin auf der Suche ist konstant Puffer und HLSL zu sehen, ob das Problem auch ist.

Bitte könnte mir jemand wenigstens in die richtige Richtung zeigen, da mich dieses Problem seit fast 2 Monaten nervt (ich habe es so lange gelassen, weil ich es selbst herausfinden wollte, aber jetzt bin ich verzweifelt nach einer Lösung) .

Vielen Dank, dass Sie sich die Zeit genommen haben, diesen Post zu lesen, es tut mir leid, aber ich brauchte so viele Informationen wie möglich in der Hoffnung, dass es einfacher zu lesen ist.

+0

Zunächst einmal verwenden Grafiken Debugger Visual Studio den Inhalt der Pixel-Shader zu überprüfen. Dieser Code hat auch Abhängigkeiten mit Vertex- und Fragment-Shadern, so dass Sie diese ebenfalls veröffentlichen müssen. Aber bevor Sie das tun, lassen Sie uns wissen, ob Sie etwas über den Grafik-Debugger sehen können. – Asesh

Antwort

0

Ihre Anrufe zu IASetIndexBuffer und IASetVertexBuffers sind in Ihrer Kreation Routinen, Sie müssen in Ihrer Render-Funktion sein (vor der entsprechenden Draw-Funktion aufzurufen, wie diejenigen sind diese Puffer auf die Laufzeit vor Zeichnung befestigen)

Sie muss nicht im Erstellungsteil sein (wie im DirectX11-Kontext zB Baukommandos und Gerät zB: Erstellen von Ressourcen sind entkoppelt).

sollten Sie haben, in der Schleife machen:

// Set vertex buffer and index buffer for your cube 
UINT stride = sizeof(SimpleVertex); 
UINT offset = 0; 
g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, 
&offset); 

// Set index buffer 
g_pImmediateContext->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 
0); 

g_pImmediateContext->VSSetShader(g_pVertexShader, nullptr, 0); 
g_pImmediateContext->VSSetConstantBuffers(0, 1, &g_pConstantBuffer); 
g_pImmediateContext->PSSetShader(g_pPixelShader, nullptr, 0); 
g_pImmediateContext->DrawIndexed(36, 0, 0); 

und vor nur alle Pyramiden zu ziehen:

// Set vertex buffer and index buffer for pyramids as you will draw it 10 times, you can do it once just before the loop as geometry will not change 
UINT stride = sizeof(SimpleVertex); 
UINT offset = 0; 
g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, 
&offset); 
// Set index buffer 
g_pImmediateContext->IASetIndexBuffer(g_pIndexBufferP, DXGI_FORMAT_R16_UINT, 0); 


for (int i = 0; i < 10; i++) 
{ 
    //Same draw code as before 
} 
+0

Das hat funktioniert! Ich kann dir nicht genug für deine Hilfe danken! – Martin

Verwandte Themen