簡體   English   中英

HLSL cbuffer不能完全寫入嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM