#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. Спасибо! Я не знал об этом, я почти сошел с ума, думая о том, что может быть не так в моем коде, но теперь он отлично работает.