Почему мой постоянный буфер не обновляется?

#c #directx-11 #hlsl

Вопрос:

Ниже приведено объявление на стороне процессора для буфера, с которым у меня возникла проблема:

 struct PSMaterialTransform {
        float Alpha;
        bool WrapUV;
        XMFLOAT2 padding;
    } static m_PSMaterialTransformDesc;
 

И ниже приведено объявление на стороне gpu для буфера:

 cbuffer MaterialTransform: register(b1) {
float Alpha;
bool WrapUV;
float2 padding;
};
 

Вот как я создаю все свои постоянные буферы:

 template<typename T>
bool Seraph::ShaderManager<T>::Create(ID3D11Device* pDevice) {
D3D11_BUFFER_DESC bd;
ZeroMemory(amp;bd, sizeof(D3D11_BUFFER_DESC));

bd.ByteWidth = sizeof(T);
bd.Usage = D3D11_USAGE_DYNAMIC;
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

hr = pDevice->CreateBuffer(amp;bd, nullptr, amp;m_pBuffer);
if (FAILED(hr))
    return Log("Failed to create constant buffer.");
return true;
}
 

И, наконец, это код, который я использую для обновления своего буфера констант:

 template<typename T>
bool Seraph::ShaderManager<T>::SetPS(ID3D11DeviceContext* pDeviceContext, Tamp; Data, int ID) {
D3D11_MAPPED_SUBRESOURCE ms;
ZeroMemory(amp;ms, sizeof(D3D11_MAPPED_SUBRESOURCE));

hr = pDeviceContext->Map(m_pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, amp;ms);
if (FAILED(hr))
    return Log("Failed to update constant buffer.");

*(T*)ms.pData = Data;

pDeviceContext->Unmap(m_pBuffer, 0);
pDeviceContext->PSSetConstantBuffers(ID, 1, amp;m_pBuffer);

return true;
}
 

Переменная ID представляет слот, в котором объявлен буфер , я уже проверил 3 раза, и значение ID равно 1 MaterialTransform , но не имеет значения, какое значение я отправляю на графический процессор, логическое значение WrapUV всегда TRUE , даже если Alpha кажется, что плавающая точка обновляется нормально.

Ответ №1:

Размер bool в HLSL составляет 4 байта, поэтому структура вашего процессора должна быть примерно такой

 struct PSMaterialTransform 
{
        float Alpha;
        int32_t WrapUV; //or uint32_t
        XMFLOAT2 padding;
} 
 

Если вы хотите, вы можете использовать typedef/используя псевдоним, подобный этому:

 typedef int32_t bool32; //or
using bool32 = int32_t;
 

Тогда вы можете написать bool32 WrapUV; вместо этого.

Комментарии:

1. Спасибо! Я не знал об этом, я почти сошел с ума, думая о том, что может быть не так в моем коде, но теперь он отлично работает.