2014-02-25 19 views
0

所以我有這個奇怪的錯誤,我還沒有弄清楚如何解決。我試圖在我的hlsl像素着色器中寫入我的cbuffer。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個字節大這應該工作

回答

1

開啓調試圖形設備(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寄存器),因此您的兩種類型不會對齊。