2016-01-25 2 views
0

Я использую SharpDX для создания базовой программы DirectX на C#. Я пытаюсь передать некоторые данные в шейдеры, используя постоянный буфер, однако, когда я создаю буфер, DirectX падает с неправильным параметром. Включение слоя отладки не дает мне больше информации. Мой код выглядит следующим образом:SharpDX - Создание постоянных аварийных буферов

consts = new ConstantBufferData() { fTime = 0.0f }; 
constantBuffer = D3D11.Buffer.Create<ConstantBufferData>(device, D3D11.BindFlags.ConstantBuffer, ref consts); 

где ConstantBufferData это структура определяется следующим образом:

[StructLayout(LayoutKind.Sequential)] 
struct ConstantBufferData 
{ 
    public float fTime; 
}; 

Как ни странно, вся программа компилируется и функционирует нормально, когда я создаю буфер в качестве буфера вершин, но использование это как постоянный буфер с context.PixelShader.SetConstantBuffer(0, constantBuffer);.

+0

вы создаете свой буфер на стеке, я не знаю SharpDX, но я предполагаю, что это не предназначено –

ответ

0

Я никогда не использовал SharpDX, но это похоже на сильно ограниченный параметр типа. Проверка кода на SharpDX's github Я вижу, что он использует указатель interop для передачи указателя.

Так что я думаю, это может быть проблема видимости, так как ConstantBufferData не определяется как общедоступный.

Или формальный вопрос пар, так как, насколько я могу видеть в CreateBuffer's doc параметр данных должен соответствовать D3D11_SUBRESOURCE_DATA структуре

Надежда это помогает.

+0

Спасибо за вашу помощь , но он ничего не изменил. Я изменил ConstantBufferData, чтобы он был общедоступным, но это не помогло. Оглядываясь в Интернете, ни один из константных примеров буфера не имеет структур, которые следуют за «D3D11_SUBRESOURCE_DATA». Пример этого можно найти здесь: http://timjones.tw/blog/archive/2011/03/08/marshalling-c-structures-into-directd-cbuffers-using – rytone

+0

Чтение из ссылки, которую вы опубликовали, я вижу там проблемы с форматом структуры, если он не является явным. Вы пытались указать макет как Явный, размер и смещение, как в примере? – podostro

+0

Hah! Это исправило это! Я попытался установить структуру в явном виде и установить смещения поля, но я чувствовал, что настройка размера не имеет значения по какой-то причине. Благодаря! – rytone

1

Размер постоянных буферов должен быть кратным 16, что не относится к вашей структуре (всего 4), поэтому создание не удастся.

С другой стороны, буфер Vertex не имеет этого ограничения, поэтому ресурс будет успешно создан в этом случае.

Если вы получаете устройство отладки, вы должны иметь это сообщение об ошибке:

D3D11 ERROR: ID3D11Device::CreateBuffer: The Dimensions are invalid. For ConstantBuffers, marked with the D3D11_BIND_CONSTANT_BUFFER BindFlag, the ByteWidth (value = 4) must be a multiple of 16. [ STATE_CREATION ERROR #66: CREATEBUFFER_INVALIDDIMENSIONS]

Два пути, чтобы исправить это.

1/Добавить отступы в вашу структуру, чтобы соответствовать кратны 16, например:

[StructLayout(LayoutKind.Sequential)] 
struct ConstantBufferData 
{ 
    public float fTime; 
    public int dum1,dum2,dum3; 
}; 

Или применять правила на размере создания буфера (убедитесь, что по размеру в описании кратно 16, в случае, ваш размер Структур является «размер», то у вас есть следующие:.

int paddedSize = ((size + 15)/16) * 16; 
Смежные вопросы