Воспроизведение кадрового буфера шейдера - PullRequest
6 голосов
/ 08 декабря 2010

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

Ответы [ 5 ]

4 голосов
/ 08 декабря 2010

Как отмечает Эндрю, доступ к кадровому буферу логически является отдельным этапом от фрагментного шейдера, поэтому чтение кадрового буфера в фрагментном шейдере невозможно. Причиной этого (чтобы ответить на вопрос Эндрю) является сочетание производительности и требований к оформлению графического конвейера. При определении конвейера рендеринга операции смешивания кадрового буфера ДОЛЖНЫ выполняться в том же порядке, что и треугольники / примитивы, которые вошли в начало конвейера. Фрагментные шейдеры, с другой стороны, могут происходить в любом порядке. Таким образом, имея отдельные этапы, графический процессор может запускать фрагментные шейдеры настолько быстро, насколько это возможно, когда их входные данные становятся доступными, без необходимости синхронизации между ними. Пока он поддерживает достаточно места в буфере для хранения на выходах фрагментных шейдеров, так что они могут накапливаться и позволять смешивать и записывать кадровый буфер по порядку, все хорошо, так как результаты любого данного фрагментного шейдера не виден до окончания стадии смешивания.

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

3 голосов
/ 08 декабря 2010

Нет.Как вы упомянули, рендеринг в текстуру - это способ достижения этой функциональности.

Если вы посмотрите на блок-схему конвейера GPU, вы увидите, что стадия смешивания - это то, что объединяет фрагментвывод шейдера с помощью кадрового буфера - отдельно от фрагментного шейдера и является фиксированной функцией.

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

(не говоря уже о том, что смешивание с фиксированными функциями в большинстве случаев "достаточно хорошо".)

2 голосов
/ 11 декабря 2010

На самом деле я думаю, что теперь это возможно с Direct3D 11 SM 5.0 (хотя я не тестировал его).

Вы можете привязать БПЛА к PS 5.0, чтобы разрешить операции чтения и записи на нем, используяmethod OMSetRenderTargetsAndUnorderedAccessViews.

В этом случае необходимо создать буфер буфера цепочки обмена, в котором вы рендеринге, с флагом DXGI_USAGE_UNORDERED_ACCESS (я полагаю).

Это используется в DXSDK OIT11образец.

1 голос
/ 03 мая 2013

Возможно чтение содержимого буфера кадра в фрагментном шейдере с расширением Shader_framebuffer_fetch.Поддержка может быть добавлена ​​в графический процессор с некоторой потерей производительности.Фактически, в эти дни я работаю над тем, чтобы добавить поддержку этого расширения в драйвер OpenGL ES2.0 хорошо известного бренда GPU на рынке бытовой электроники.

0 голосов
/ 22 декабря 2010

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

...