Передача параметров в постоянный буфер в SlimDX Direct3D 11 - PullRequest
1 голос
/ 16 февраля 2011

это связано с Настройка постоянного буфера с использованием SlimDX

У меня есть шейдер, который очень прост и выглядит так:

cbuffer ConstantBuffer : register(b0)
{
    float4 color;
}

float4 VShader(float4 position : POSITION) : SV_POSITION
{
    return position;
}

float4 PShader(float4 position : SV_POSITION) : SV_Target
{
    return color;
}

Всеон применяет цвет, передаваемый через постоянный буфер, к каждому нарисованному пикселю, очень просто.

В моем коде я определяю свой постоянный буфер следующим образом:

[StructLayout(LayoutKind.Explicit)]
        struct ConstantBuffer
        {
            [FieldOffset(0)]
            public Color4 Color;
        }

И устанавливаю его здесь, в моем цикле рендеринга.

ConstantBuffer cb = new ConstantBuffer();
cb.Color = new Color4(Color.White);
using (DataStream data = new DataStream(Marshal.SizeOf(typeof(ConstantBuffer)), true, true))           
{
    data.Write(cb);
    data.Position = 0;
    D3D.Buffer buffer = new D3D.Buffer(device,data, new BufferDescription
    {
        Usage = ResourceUsage.Default,
        SizeInBytes = Marshal.SizeOf(typeof(ConstantBuffer)),
        BindFlags = BindFlags.ConstantBuffer
    });
    context.UpdateSubresource(new DataBox(0, 0, data), buffer, 0);
}

контекст - это мое устройство. ImmediateContext и device - это мое устройство Direct3D.Однако, когда он работает, он рисует мои пиксели черным, несмотря на то, что он прошел через белый цвет, поэтому ясно, что значение не устанавливается.

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 16 февраля 2011

Вы должны создать объект D3D.Buffer один раз, обновлять его так часто, как вы хотите (вы указываете исходные данные в качестве аргумента конструктора, поэтому, если вы собираетесь всегда иметь белый объект, нет необходимости вызывать UpdateSubresource и связать его с конвейером (context.PixelShader.SetConstantBuffer(buffer, 0)) перед вызовом отрисовки.

...