D3D11 запись в буфер в геометрическом шейдере

#opengl #windows-7 #directx #direct3d #directx-11

#opengl #windows-7 #directx #direct3d #directx-11

Вопрос:

У меня есть некоторый рабочий код OpenGL, который меня попросили перенести в Direct3D 11. В моем коде я использую объекты Shader Storage Buffer Objects (SSBO) для чтения и записи данных в geometry shader.

Я довольно новичок в программировании Direct3D. Благодаря Google я смог идентифицировать D3D-эквивалент SSBO, RWStructuredBuffer (я думаю).

Проблема в том, что я совсем не уверен, что смогу использовать их в geometry shader в D3D11, который, насколько я понимаю, обычно может использовать только до 4 «потоков вывода» (это что-то вроде буфера обратной связи преобразования?).

Вопрос в том, есть ли какой-либо способ с помощью D3D11 / 11.1 делать то, что я делаю в OpenGL (то есть записывать в SSBO из geometry shader)?

ОБНОВЛЕНИЕ: Только что нашел эту страницу: http://msdn.microsoft.com/en-us/library/windows/desktop/hh404562(v=vs.85).aspx

Если я правильно понимаю раздел «Использовать беспилотные летательные аппараты на каждом этапе конвейера», кажется, что доступ к таким буферам разрешен на всех этапах шейдера. Затем я обнаружил, что DX11.1 доступны только в Windows 8, но некоторые функции также перенесены в Windows 7. Включена ли эта часть Direct3D в те функции, которые доступны в Windows 7?

Комментарии:

1. Разве это не объясняется в этой статье MSDN ?

2. Привет, Роджер, спасибо за ссылку, я ее не нашел. Однако по этой ссылке все еще очень неясно, какая часть D3D11.1 доступна в Win7, и, более конкретно, разрешен ли доступ UAV со всех этапов шейдера. Они обсуждают некоторые различия с моделью драйвера WDDM1.2, и это все. Но, возможно, я могу затем попробовать и посмотреть, получу ли я ошибку компиляции, используя одну из функций доступа в geometry shader.

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

Ответ №1:

RWBuffers не связаны с geometry shader, выводящим геометрию, они встречаются в основном в compute shader и в меньшем проценте в pixel shader, и, как вы заметили, для других этапов требуется D3D 11.1 и Windows 8.

То, что вы ищете, — это потоковый вывод. API для привязки буферов к выходным данным этапа geometry shader является ID3D11DeviceContext::SOSetTargets , и буферы должны создаваться с флагом D3D11_BIND_STREAM_OUTPUT

Кроме того, вывод геометрии с помощью geometry shader был дополнением из D3D10, в D3D11 часто возможно иметь что-то по крайней мере столь же эффективное и простое с вычислительными шейдерами. Конечно, это не абсолютный совет.

Комментарии:

1. Итак, вы говорите, что я не могу записывать в RWBuffer или RWStructuredBuffer из GS в Windows7, даже используя обновление платформы? Я могу корректно извлекать данные из буферов SRV, но когда я пытаюсь записать данные в RWStructuredBuffer, я получаю ошибку времени выполнения «недопустимая техника xyz». Проблема в том, что я получаю ту же ошибку также, если я пытаюсь записать RWStructuredBuffer из вершинного шейдера, этап, на котором эта операция должна быть разрешена, согласно спецификациям. Может быть, я делаю что-то не так? Я просто объявил свой буфер как: RWStructuredBuffer<float4> wb: register( u0 ); и написал с wb[idx] = float4(smtg);

2. о, я также привязываю беспилотный летательный аппарат таким образом: m_effect->GetVariableByName("wb")->AsUnorderedAccessView()->SetUnorderedAccessView(myUAV);

Ответ №2:

Геометрический шейдер обрабатывается один раз для каждого собранного примитива и в результате может генерировать один или несколько примитивов.

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

Смотрите эту обзорную схему конвейера и это описание этапов конвейера.

Геометрический шейдер имеет доступ к другим ресурсам, связанным с помощью метода GSSetShaderResources в контексте устройства. Однако обычно это ресурсы, которые «фиксированы» во время выполнения шейдера, такие как константы и текстуры. Данные, которые меняются при каждом выполнении геометрического шейдера, являются входным примитивом для шейдера.

Ответ №3:

только что было указано на эту страницу:http://nvidia.custhelp.com/app/answers/detail/a_id/3196 /~/поддержкаdirectx-api ферми-и-кеплера . Короче говоря, nvidia не поддерживает эту функцию на картах < Maxell. Это в значительной степени отвечает на мой вопрос. :/