PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : D3D11: HLSL Constant Buffer


Markus89
2011-12-04, 14:20:07
Hallo,

ich versuche mich gerade zum ersten Mal an DirectX11 (bisher habe ich OpenGL benutzt). Ich möchte ein Fullscreen-Quad rendern und im Shader ein paar Dinge berechnen (was auch funktioniert).

Ich will jetzt aber auch ein paar Daten an den Pixelshader übergeben:


// HLSL
cbuffer cbDesc : register( b0 )
{
float dt;
int count;
float2 offset;
};

cbuffer cbData : register( b1 )
{
// cbDesc.count gibt die Anzahl an aktiven Elementen an
float2 Pos[32];
}

// C++
struct CBDesc
{
float dt;
int count;
Vec2f offset;
};

struct Vec2f {
// ...
float x, y;
};

struct CBData
{
Vec2f Pos[32];
};

// Create the constant buffers
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(CBWaveDesc);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
hr = g_pd3dDevice->CreateBuffer( &bd, NULL, &g_pCBeDesc );
if( FAILED( hr ) )
return hr;

// gleiches für CBData


g_pImmediateContext->UpdateSubresource( g_pCBDesc, 0, NULL, &g_cbWaveDesc, 0, 0 );
g_pImmediateContext->UpdateSubresource( g_pCBData, 0, NULL, &g_cbWaveData, 0, 0 );

g_pImmediateContext->PSSetConstantBuffers( 0, 1, &g_pCBDesc );
g_pImmediateContext->PSSetConstantBuffers( 1, 1, &g_pCBData );


Wenn ich das so ausführe, ist bei count=1 cbData.Pos[0] richtig. Wenn ich count=2 setze, dann ist cbData.Pos[1] aber offenbar (0.0f, 0.0f).

Muss man hier irgendwas beim alignment beachten oder so?

Demirug
2011-12-04, 14:56:54
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/bb509581(v=vs.85).aspx

Das müsste sein was du suchst.

Markus89
2011-12-04, 15:09:17
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=VS.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/bb509581(v=vs.85).aspx

Das müsste sein was du suchst.

Hat funktioniert, danke!