Поделиться через


Представление PRT с текстурами (Direct3D 9)

Пример PRTDemo и симулятор PRTCmdLine, включенные в пакет SDK для DirectX, представляют векторы передачи на вершинах сетки. Чтобы точно представить сигнал PRT, для этого могут потребоваться тесселяции, которые могут быть непрактичными для текущих игр. Представление векторов передачи в картах текстур является альтернативным подходом, который имеет одинаковую стоимость данных независимо от сложности сетки. Существует несколько способов создания карт текстур передачи с помощью библиотеки PRT D3DX.

Предварительное вычисление векторов передачи

Один из подходов — изменение образцов PRTDemo и PRTCmdLine для вычисления вектора передачи на каждом текселе в параметризации поверхности. Для этого выполните следующие действия.

  1. Измените вызов D3DXCreatePRTEngine , чтобы извлечь координаты текстуры из сетки (ExtractUV должно иметь значение TRUE).
  2. Замените вызовы D3DXCreatePRTBufferна D3DXCreatePRTBufferTex , используя тот же размер текстуры.

Все методы ID3DXPRTEngine работают с симуляциями по текселям, за исключением: ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSS и ComputeDirectLightingSHAdaptive. Хотя моделирование пространства текстуры приводит к правильному результату, оно часто может быть довольно медленным, так как оно, скорее всего, будет вычислять векторы передачи с высокой плотностью.

Другой подход заключается в вычислении адаптивного моделирования PRT для каждой вершины (с координатами текстуры, которые будут использоваться для данных каждого текселя), а затем вызвать ID3DXPRTEngine::ResampleBuffer (используя выходной буфер, созданный с помощью D3DXCreatePRTBufferTex в соответствующем разрешении). Это работает со всеми функциями PRT D3DX в пакете SDK и часто может быть гораздо эффективнее, чем непосредственное вычисление буфера передачи по текселям.

Вычисления среды выполнения

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

Если сжатие создает несколько кластеров, вы не сможете отфильтровать или сопоставить данные, так как кластеризация индексы не являются непрерывными. Ниже приведены некоторые альтернативы для обработки данных с несколькими кластерами.

  • Выполните фильтрацию самостоятельно в пиксельном шейдере. К сожалению, это обычно непрактично по соображениям производительности.
  • Если текстуры являются текстурами с низким разрешением, не сопоставленными с MIP (т. е. картами света), скорее всего, эффективнее просто вычислить освещение непосредственно в пространстве текстуры, где фильтрация не будет происходить, и отобразить объект с затененной текстурой. По сути, это динамическая карта света, созданная полностью на GPU.
  • Если используется атлас текстур (см . раздел Использование UVAtlas (Direct3D 9)), можно вручную кластеризать сцену, задав все векторы передачи в подключенном компоненте в пространстве текстуры в одном кластере. Таким образом можно отфильтровать текстуру, так как все доступные тексели будут находиться в одном кластере по конструкции. Идентификатор кластера для данного лица может распространяться из вершинного шейдера.

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

Предварительно вычисляемая передача radiance

Пример демонстрации PRT

Симулятор PRT (prtcmdline.exe)