HLSL float-array Verpacken in die Konstanten-Puffer?

Menschen.

Ich habe ein problem, die übergabe eines float-array zu vertex-shader (HLSL) durch Konstante Puffer. Ich weiß, dass jeder "float" in dem array unten wird ein 16-byte-Ablagefach, das alle von selbst (Speicherplatz entspricht float4) wegen HLSL Verpackung-Regel:

//C++ struct
struct ForegroundConstants
{
    DirectX::XMMATRIX transform;
    float bounceCpp[64];
};


//Vertex shader constant buffer
cbuffer ForegroundConstantBuffer : register(b0)
{
    matrix transform;
    float bounceHlsl[64];
};

(Leider ist die einfache Lösung hier nicht funktioniert, wird nichts gezeichnet, nachdem ich diese änderung vorgenommen)

Während die C++ - Daten übergeben bekommt, durch die Verpackung Sie in der Regel bekommen beabstandet, so dass jeder "float" in der bounceCpp C++ - array wird in einen 16-byte-Raum, ganz von selbst in bounceHlsl array. Dies führte zu einer Warnung, die der folgenden ähnelt:

ID3D11DeviceContext::DrawIndexed: Die Größe des Konstanten-Puffer auf Steckplatz 0 des Vertex-Shader-Einheit ist zu klein (320 Byte zur Verfügung gestellt, 1088 bytes, zumindest erwartet). Das ist OK, wie out-of-bounds liest definiert sind, auf 0 zurück. Es ist auch möglich, der Entwickler weiß, dass die fehlenden Daten nicht verwendet werden, sowieso. Dies ist nur ein problem, wenn die Entwickler eigentlich zu beabsichtigen, eine hinreichend große Konstante Puffer für das, was der shader erwartet.

Die Empfehlung wird darauf hingewiesen, hier und hier, ist, zu schreiben, die HLSL constant buffer auf diese Weise:

cbuffer ForegroundConstantBuffer : register(b0)
{
    matrix transform;
    float4 bounceHlsl[16]; //equivalent to 64 floats.
};

static float temp[64] = (float[64]) bounceHlsl;

main(pos : POSITION) : SV_POSITION
{
    int index = someValueRangeFrom0to63;
    float y = temp[index];

    //Bla bla bla...
}

Aber das hat nicht funktioniert (d.h. ID3D11Device1::CreateVertexShader kehrt nie zurück). Sammle ich Dinge, die gegen Shader-Modell 4 Level 9_1, können Sie vor Ort alles, was habe ich falsch gemacht hier?

Vielen Dank im Voraus! 🙂

Grüße,
Ben

InformationsquelleAutor Ben Goh | 2013-02-05
Schreibe einen Kommentar