Задать текстуру в пиксельном шейдере и сделать ее целью рендера? - PullRequest
2 голосов
/ 25 октября 2009

Мне было интересно, если я отрисовываю сцену, используя шейдер, которому я передаю текстуру, которая также является целью рендеринга для этой сцены, это вызовет какое-либо нежелательное поведение?

Так в основном:

texture t;

shader->SetTexture("texture",t);

device->SetRenderTarget( 0, t->surface );

shader->Begin("effect")
// do some more shader stuff

device->EndScene();

что именно это вызовет?

Если я не очищу цель рендеринга перед рендерингом, текстура все равно будет работать? Я просто предполагаю, что окончательные изменения не будут записаны в текстуру, пока не будет вызвано device-> End?

Ответы [ 3 ]

3 голосов
/ 25 октября 2009

Полагаю, вы говорите о DirectX9. В документации ничего не говорится об этом конкретном случае, но я могу сказать вам следующее:

Я просто предполагаю, что окончательные изменения не будут записаны в текстуру, пока устройство-> End не будет вызвано

Это неверное предположение. Подумайте об этом, вы предполагаете, что все пиксели всех нарисованных треугольников будут сохранены «где-то», и все ваши выборки текстур будут выполнены без записи пикселей обратно в цель рендеринга. Это требует произвольного количества памяти и, следовательно, невозможно.

На практике:

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

Итак, если DX9 не жалуется (попробуйте, если вы действительно хотите знать, я больше не делаю DX9), будет неопределенным.

Тем не менее, DirectX10 более четко говорит об этом ( source ):

Если какие-либо субресурсы также в настоящее время Обязательно для чтения или письма (возможно в другой части трубопровода), эти точки привязки будут обнулены чтобы предотвратить тот же субресурс из быть прочитанным и написанным одновременно в одной операции рендеринга.

Итак, в DirectX10 ваши настройки текстуры будут удалены API.

3 голосов
/ 25 октября 2009

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

2 голосов
/ 26 октября 2009

Среда выполнения отладки не позволит вам сделать это и выдаст предупреждение. Время выполнения релиза может (но, вероятно, не будет) работать.

Проблема заключается в том, что между загрузкой пикселя из текстуры и ее использованием существует большая задержка. Это исправлено загрузкой блока текселей в кеш. Записи буферизуются и записываются прямо в память. Таким образом, вы, скорее всего, столкнетесь с проблемой, которая может быть связана с чтением текселя, который, возможно, уже был обновлен, но кэш будет устаревшим. Если вы читаете ТОЛЬКО тексель, который записывается в него, «может» работать, но реально такие детали реализации оставлены на усмотрение IHV. Они не обязаны позволять этому работать.

Как говорили другие ... это очень неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...