Установка текстуры в пиксельном шейдере и превращение ее в цель рендеринга?

StackOverflow https://stackoverflow.com/questions/1620096

Вопрос

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

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

texture t;

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

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

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

device->EndScene();

к чему именно это приведет?

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

Это было полезно?

Решение

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

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

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

На практике:

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

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top