Настройка буфера констант с помощью SlimDX

Я следил за учебниками Microsoft Direct3D11, но использовал C# и SlimDX. Я пытаюсь установить постоянный буфер, но не знаю, как его создать или установить.

Я просто пытаюсь установить три матрицы (мир, вид и проекция), используя постоянный буфер, но я борюсь на каждом этапе: создание, ввод данных и передача их шейдеру.

HLSL на MSDN (который я по существу скопировал):

cbuffer ConstantBuffer : register( b0 )
{
    matrix World;
    matrix View;
    matrix Projection;
}

Код С++ в MSDN:

ID3D11Buffer* g_pConstantBuffer = NULL;
XMMATRIX g_World;
XMMATRIX g_View;
XMMATRIX g_Projection;

//set up the constant buffer
D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(ConstantBuffer);
bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bd.CPUAccessFlags = 0;
if( FAILED(g_pd3dDevice->CreateBuffer( &bd, NULL, &g_pConstantBuffer ) ) )
    return hr;


//
// Update variables
//
ConstantBuffer cb;
cb.mWorld = XMMatrixTranspose( g_World );
cb.mView = XMMatrixTranspose( g_View );
cb.mProjection = XMMatrixTranspose( g_Projection );
g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb, 0, 0 );

Кто-нибудь знает, как перевести это на SlimDX? Или, если кто-нибудь знает какие-либо учебные пособия или ресурсы SlimDX, которые также были бы полезны.

Спасибо.


person Nick Udell    schedule 10.02.2011    source источник


Ответы (1)


Что-то похожее на это должно работать:

var buffer = new Buffer(device, new BufferDescription {
    Usage = ResourceUsage.Default,
    SizeInBytes = sizeof(ConstantBuffer),
    BindFlags = BindFlags.ConstantBuffer
});

var cb = new ConstantBuffer();
cb.World = Matrix.Transpose(world);
cb.View = Matrix.Transpose(view);
cb.Projection = Matrix.Transpose(projection);

var data = new DataStream(sizeof(ConstantBuffer), true, true);
data.Write(cb);
data.Position = 0;

context.UpdateSubresource(new DataBox(0, 0, data), buffer, 0);
person MikeP    schedule 10.02.2011
comment
Это имеет смысл, но я получаю следующие ошибки: SlimDX.D3DCompiler.ConstantBuffer не имеет конструктора, который принимает нулевые аргументы (конструктор ConstantBuffer(intPtr Pointer), а также cb.World, cb.View и cb.Projection не существуют, Visual Studio помечает их как ошибки (SlimDX.D3DCompiler.ConstantBuffer не содержит определения для World) Я использую последнюю стабильную сборку SlimDX (загружен неделю назад). - person Nick Udell; 11.02.2011
comment
ConstantBuffer в этом фрагменте относится к вашему собственному типу пользователя, который содержит константы, которые вы хотите установить. Вы можете называть это как хотите. - person MikeP; 11.02.2011