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?
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?