gpt4 book ai didi

c++ - 恒定缓冲区 DirectX 11

转载 作者:行者123 更新时间:2023-11-30 03:58:50 25 4
gpt4 key购买 nike

我对 HLSL D3D11 中的 CBuffer 没有更新感到非常沮丧,初始值是在应用程序启动时设置的,但更新是不行的,使用了 UpdateSubResource,还尝试了 ID3D11DeviceContext::Map 和 ID3D11DeviceContext::UnMap。

注意:使用 D3D11_USAGE_DYNAMIC 和 D3D11_CPU_ACCESS_WRITE 设置 CBuffer。

我的 ID3D11Buffer(常量缓冲区)在查询大小时只返回 4 个字节....听起来像是问题的一部分

struct VS_CBUFFER_DATA
{
XMFLOAT4X4 world;
XMFLOAT4X4 view;
XMFLOAT4X4 projection;

VS_CBUFFER_DATA()
{
XMStoreFloat4x4(&world, DirectX::XMMatrixIdentity());
XMStoreFloat4x4(&view, DirectX::XMMatrixIdentity());
XMStoreFloat4x4(&projection, DirectX::XMMatrixIdentity());
}
};

D3D11_BUFFER_DESC cbufferDesc;
memset(&cbufferDesc, 0, sizeof(cbufferDesc));

cbufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER
cbufferDesc.Usage = D3D11_USAGE_DYNAMIC;
cbufferDesc.ByteWidth = sizeof(m_CBufferData);
cbufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbufferDesc.MiscFlags = 0;
cbufferDesc.StructureByteStride = 0;

D3D11_SUBRESOURCE_DATA subdata;
memset(&subdata, 0, sizeof(subdata));

subdata.pSysMem = &m_CBufferData;

if (FAILED(pRendererTemp->CreateBuffer(cbufferDesc
{
OutputDebugString("Failed to create CBuffer!")
goto failed;
}

void Cube::UpdateViewProjection(__in const Renderer* pRenderer, __in const XMFLOAT4X4 &view, __in const XMFLOAT4X4 &proj)
{
D3D11_MAPPED_SUBRESOURCE mappedSubResource;
memset(&mappedSubResource, 0, sizeof(mappedSubResource));

if (SUCCEEDED(pRenderer->GetDevContext()->Map(m_pCBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedSubResource)))
{
Primitive::UpdateViewProjection(NULL, view, proj);
VS_CBUFFER_DATA* cbData = (VS_CBUFFER_DATA*)&mappedSubResource.pData;

memcpy(cbData, &m_CBufferData, sizeof(cbData));
pRenderer->GetDevContext()->Unmap(m_pCBuffer, 0);
SetBuffers(pRenderer);
}
}

// SHADER.vsh
cbuffer cbMatrixBuffer : register(b0)
{
float4x4 world;
float4x4 view;
float4x4 projection;
};

最佳答案

您的问题出在memcpy 中。这行在这里:

memcpy(cbData, &m_CBufferData, sizeof(cbData));

复制的字节数等于 VS_CBUFFER_DATA 指针的大小,在 32 位系统上为 4 个字节(在 x64 上为 8 个字节)。代码应为:

memcpy(cbData, &m_CBufferData, sizeof(VS_CBUFFER_DATA));

这将复制 48 个字节的数据,而不是 4/8(无论 sizeof(void*) 的计算结果是什么)。

一般来说,避免使用 sizeof 来查询数组的大小,尤其是在指针方面避免使用它(除非您有此需要)。

关于c++ - 恒定缓冲区 DirectX 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27238214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com