Ich bin gerade auf ein sehr merkwürdiges Problem gestoßen und hoffe, dass ich am Ende einfach nur zu blind oder müde war.
Es geht um folgendes: Ich habe einen Pixelshader, dem ich eine Reihe an Lichtinformationen zum Himmel über einen Constantbuffer gebe. In diesem Buffer sind auch noch einige Matrizen und Informationen über die Szene, sodass der Buffer am ende rund 1300bytes groß ist:
Code: Alles auswählen
struct SceneParams
{
float S_FogStart;
float S_FogEnd;
float S_FogRange; // = FogEnd - FogStart
float S_pad0;
float4 S_FogColor;
uint S_LightCLUT[256]; // CLUT from gothic
};
cbuffer CB_PerFrame : register( b0 )
{
matrix M_View;
matrix M_Proj;
matrix M_ViewProj;
matrix M_InverseView;
SceneParams PF_SceneParams;
};
Code: Alles auswählen
float4 GetLightCLUT(float lighting)
{
// This is the way PB computes the index for the CLUT
uint v = clamp((uint)(lighting.x * 255), 0, 255);
return DWORDToFloat4(PF_SceneParams.S_LightCLUT[v]);
};
Der Debug-Layer schmeißt mir dort eine Warnung, dass ich versuchen würde über die Grenzen des Constantbuffers hinauszulesen (Es werden über 4000bytes erwartet, aber der Buffer hat ja nur knapp 1300.)! Selbst wenn ich dort 64 hineinschreibe, bin ich schon ein paar Bytes drüber. Allerdings ist der Buffer nicht zu klein, denn sogar der Debuglayer kennt die richtige Größe des Buffers, da dort ja steht wie viele vorhanden waren und was tatsächlich gelesen wurde.
Edit: Hier, die Warnung, entstanden aus folgender Zeile:
Code: Alles auswählen
DWORDToFloat4(PF_SceneParams.S_LightCLUT[64])
=>
D3D11 WARNING: ID3D11DeviceContext::DrawIndexed: The size of the Constant Buffer at slot 0 of the Pixel Shader unit is too small (1312 bytes provided, 1328 bytes, at least, expected). This is OK, as out-of-bounds reads are defined to return 0. It is also possible the developer knows the missing data will not be used anyway. This is only a problem if the developer actually intended to bind a sufficiently large Constant Buffer for what the shader expects. [ EXECUTION WARNING #351: DEVICE_DRAW_CONSTANT_BUFFER_TOO_SMALL]
Woher könnte also diese Warnung kommen, und wie bringe ich HLSL dazu, das zu tun, was es eigentlich tun sollte?
Grüße,
Degenerated