简体   繁体   中英

HLSL cbuffer does not get written to completely?

so I have this weird bug that I have yet to figure out how to fix. Im trying to write to my cbuffer in my hlsl pixel shader.

//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);

I know its not all of my code but this is a really weird error both buffers are 64 bytes big this should work

Turn on the Debug Graphics Device (D3D11_CREATE_DEVICE_DEBUG) and you should see that your constant buffer is not 64 bytes in HLSL as you expect.

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

All told, your constant buffer is 80 bytes in size. Meanwhile your struct on the C++ side is made up of structures of floats which don't adhere to the HLSL packing rules (float4 registers) so your two types don't align.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM