[英]HLSL cbuffer does not get written to completely?
所以我有一個奇怪的錯誤,我還沒有弄清楚如何解決。 我試圖在我的hlsl像素着色器中寫入我的cbuffer。
//this is in the hlsl
cbuffer LightBuffer : register(b2)
{
float4 lightRange ;//will right but only to lightRange.x
float3 lightPos ;//will right correctly
float3 lightColor ;//will right correctly for x and y but not z
float3 lightDirection ;//will not right correctly
float2 spotLightAngles ;//???? all around
float padding; //useless padding
};
//This is in another file
struct LightBufferType
{
D3DXVECTOR4 LightRange;
D3DXVECTOR3 LightPosition;
D3DXVECTOR3 LightColor;
D3DXVECTOR3 lightDirection;
D3DXVECTOR2 SpotLightAngles;
float padding;
};
//createing the buffer
// Setup the description of the light dynamic constant buffer that is in the pixel shader.
lightBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
lightBufferDesc.ByteWidth = sizeof(LightBufferType);
lightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
lightBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
lightBufferDesc.MiscFlags = 0;
lightBufferDesc.StructureByteStride = 0;
result = device->CreateBuffer(&lightBufferDesc, NULL, &m_lightBuffer);
if(FAILED(result))
{
ERROR_LOGGER->WriteErrorMessage("Could not Create LightBuffer");
return false;
}
//mapping the data
result = deviceContext->Map(m_lightBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if(FAILED(result))
{
ERROR_LOGGER->WriteErrorMessage("Could not Map Light Buffer");
return false;
}
// Get a pointer to the data in the constant buffer.
dataPtr2 = (LightBufferType*)mappedResource.pData;
// Copy the lighting variables into the constant buffer.
dataPtr2->LightRange = lightRange;
dataPtr2->LightPosition = lightPosition;
dataPtr2->LightColor = LightColor;
dataPtr2->lightDirection = LightDirection;
dataPtr2->SpotLightAngles = SpotLAngles;
// Unlock the constant buffer.
deviceContext->Unmap(m_lightBuffer, 0);
// Set the position of the light constant buffer in the pixel shader.
bufferNumber = 2;
// Finally set the light constant buffer in the pixel shader with the updated values.
deviceContext->PSSetConstantBuffers(bufferNumber, 1, &m_lightBuffer);
我不知道我的代碼不是全部,但這是一個非常奇怪的錯誤,兩個緩沖區都為64字節大,應該可以使用
打開調試圖形設備(D3D11_CREATE_DEVICE_DEBUG),您應該看到HLSL中的常量緩沖區不是您期望的64字節。
// cbuffer LightBuffer
// {
//
// float4 lightRange; // Offset: 0 Size: 16
// float3 lightPos; // Offset: 16 Size: 12
// float3 lightColor; // Offset: 32 Size: 12
// float3 lightDirection; // Offset: 48 Size: 12
// float2 spotLightAngles; // Offset: 64 Size: 8
// float padding; // Offset: 72 Size: 4
//
// }
總而言之,您的常量緩沖區的大小為80個字節。 同時,您在C ++端的結構由不遵循HLSL打包規則(float4寄存器)的float組成,因此您的兩種類型不對齊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.