Warum wird mein Puffer nicht aktualisiert?


7

Ich bin wirklich frustriert, weil mein cbufer nicht aktualisiert wird. Das ist mein VS:

cbuffer MatrixBuffer: register(b0)
{
float4x4 worldViewProj;

};

struct VertexIn
{
float4 Pos : POSITION;
float4 Color: COLOR;
};

struct PixelIn
{
float4 PosH : SV_POSITION;
float4 Color: COLOR;
};

PixelIn VS (VertexIn vin)
{
PixelIn vout;

vin.Pos.w = 1.0f;

vout.PosH = mul(vin.Pos, worldViewProj);

vout.Color = vin.Color;

return vout;
}

PixelIn VS1(VertexIn vin)
{
PixelIn vout;

vin.Pos.w = 1.0f;
vout.PosH = vin.Pos;

vout.Color = vin.Color;

return vout;
}

Bei Verwendung von VS1 wird korrekt gezeichnet, bei Verwendung von VS wird jedoch nichts gezeichnet?

Hier ist mein CBUFFER-Update-Code

bool Game::UpdateShaders()
{
    HRESULT result;
    D3D11_MAPPED_SUBRESOURCE mappedResource;
    MatrixBufferType* dataPtr;

    worldViewProjM = worldM * viewM * projM;
    worldViewProjM = XMMatrixTranspose(worldViewProjM);
    result = md3dDeviceContext->Map(mMatrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
    if (FAILED(result))
    {
        MessageBoxW(mMainWnd, L"FAOE:", 0, 0);
        return false;
    }

    dataPtr = (MatrixBufferType*)mappedResource.pData;

    dataPtr->worldViewProj = worldViewProjM;

    md3dDeviceContext->Unmap(mMatrixBuffer, 0);

    int NBuffers = 0;

    md3dDeviceContext->VSSetConstantBuffers(0, 1, &mMatrixBuffer);
    //md3dDeviceContext->PSSetConstantBuffers(0, 1, &mMatrixBuffer);

    return true;
}

Hier ist meine MATRIXBUFFERTYPE-Struktur:

struct MatrixBufferType
{
        XMMATRIX worldViewProj;
};

Dies wird aufgerufen, nachdem ich meine Tiefenschablonenansicht gelöscht und die Zielansicht gerendert habe. Weiß jemand, warum mein CBUFFER nicht aktualisiert wird?

Danke im Voraus.


1
Sind Sie sicher, dass das Problem nicht die Matrix selbst ist? Der Code sieht für die Aktualisierung der CB im Allgemeinen korrekt aus.
Chuck Walbourn

@ChuckWalbourn Die Matrix besteht aus einer Weltmatrix, die ich als Identitätsmatrix angegeben habe. Eine Projektionsmatrix, die nur XMMatrixPerspectiveFovLH (0,25 * 3,1415, mClientWidth / mClientHeight, 1,0f, 100,0f) ist. XMStoreFloat4x4 (& projM, proj); und eine Ansichtsmatrix, die nur XMMATRIX V = XMMatrixLookAtLH ist (pos, target, up);
Daniel Hop

Ich sehe, wie Sie es berechnen, aber im Debugger sollten Sie die Werte überprüfen, um sicherzustellen, dass sie angemessen sind.
Chuck Walbourn

@ChuckWalbourn Wie kann ich das machen?
Daniel Hop

Antworten:


0

Sie müssen Ihre Subressource aktualisieren (wenn ich mich nicht irre):

md3dDeviceContext->UpdateSubresource(mMatrixBuffer, 0, NULL, &worldViewProjM, 0, 0);

Ich denke, Sie können keinen konstanten Puffer haben, der MapSubresource zuordnen / aufheben kann. Da UpdateSubresource einen Standardnutzungspuffer benötigt und eine Map.unmap einen dynamischen Puffer benötigt. Ich habe auch nur uodateSubresource ausprobiert, aber das hat auch nicht funktioniert :(
Daniel Hop

Sie können Konstanten entweder verwenden UpdateSubresourceoder Map/ Discardaktualisieren. Siehe Windows to Reality:
Optimale Nutzung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.