Tại sao cbuffer của tôi không cập nhật?


7

Tôi thực sự thất vọng vì cbufer của tôi không cập nhật. Đây là VS của tôi:

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;
}

Khi sử dụng VS1, nó vẽ chính xác, nhưng khi sử dụng VS, nó không vẽ gì cả?

Đây là mã cập nhật CBUFFER của tôi

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;
}

Đây là cấu trúc MATRIXBUFFERTYPE của tôi:

struct MatrixBufferType
{
        XMMATRIX worldViewProj;
};

Điều này được gọi sau khi tôi xóa chế độ xem stprint sâu của mình và hiển thị chế độ xem mục tiêu. Có ai biết tại sao CBUFFER của tôi không cập nhật không?

Cảm ơn trước.


1
Bạn có chắc vấn đề là không có ma trận? Mã nhìn chung có vẻ đúng để cập nhật CB.
Chuck Walbourn

@ChuckWalbourn Ma trận bao gồm một ma trận thế giới, mà tôi đã chỉ định là một ma trận danh tính., Một ma trận chiếu chỉ là XMMatrixPers perspectiveFovLH (0.25 * 3.1415, mClientWidth / mClientHeight, 1.0f, 100.0f); XMStoreFloat4x4 (& projM, proj); và một ma trận View chỉ là XMMATRIX V = XMMatrixLookAtLH (pos, target, up);
Daniel Hợp

Tôi thấy cách bạn đang tính toán nó, nhưng trong trình gỡ lỗi, bạn nên kiểm tra các giá trị để đảm bảo chúng hợp lý.
Chuck Walbourn

@ChuckWalbourn Làm thế nào tôi có thể làm điều đó?
Daniel Hợp

Câu trả lời:


0

bạn phải cập nhật nguồn phụ của mình (nếu tôi không nhầm):

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

Tôi nghĩ bạn không thể có một bộ đệm liên tục, người có thể ánh xạ / unmap và UpdateSubresource. Vì UpdateSubresource cần bộ đệm sử dụng Mặc định và Map.unmap cần bộ đệm Động. Tôi cũng đã thử chỉ uodateSubresource, nhưng nó cũng không hoạt động :(
Daniel Hop

Bạn có thể sử dụng UpdateSubresourcehoặc Map/ Discardđể cập nhật hằng số. Xem Windows để thực tế: Tận dụng tối đa đồ họa Direct3D 10 trong các trò chơi của bạn
Chuck Walbourn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.