Представление PRT с текстурами (Direct3D 9)
Пример PRTDemo и симулятор PRTCmdLine, включенный в пакет SDK DirectX, представляют векторы передачи в вершинах сетки. Для точного представления сигнала PRT это может потребовать тесселяции, которые могут быть непрактичными для текущих игр. Представление векторов передачи в картах текстур является альтернативным подходом, который имеет одинаковую стоимость данных независимо от сложности сетки. Существует несколько способов создания карт текстур вектора передачи с помощью библиотеки PRT D3DX.
Предварительная компиляция векторов передачи
Одним из способов является изменение примеров PRTDemo и PRTCmdLine для вычисления вектора передачи на каждом текселье в параметризации поверхности. Для этого выполните указанные ниже действия.
- Измените вызов D3DXCreatePRTEngine, чтобы извлечь координаты текстуры из сетки (ExtractUVs должен быть TRUE)
- Замените вызовы D3DXCreatePRTBuffer на D3DXCreatePRTBufferTex, используя такой же размер текстуры.
Все методы ID3DXPRTEngine работают с имитациями на уровне каждого текселя, за исключением: ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSS и ComputeDirectLightingSHAdaptive. Хотя симуляция в пространстве текстур создает правильный результат, она часто может работать довольно медленно, так как, скорее всего, будет вычислять векторы переноса с высокой плотностью.
Другой подход заключается в вычислении адаптивного моделирования PRT по вершинам (с координатами текстур, которые будут использоваться для данных по каждому текселю), а затем вызывать ID3DXPRTEngine::ResampleBuffer (используя выходной буфер, созданный с помощью D3DXCreatePRTBufferTex в соответствующем разрешении). Это работает со всей функциональностью PRT D3DX в пакете SDK и часто может быть гораздо эффективнее, чем непосредственное вычисление буфера передачи на тексель.
Вычисления среды выполнения
Если используется один кластер, результаты можно фильтровать и применять мип-маппинг, как для любой другой текстуры, а шейдер пикселей имеет тот же код шейдера вершин, который входит в комплект поставки PRTDemo.
Если сжатие создает несколько кластеров, невозможно отфильтровать или использовать MIP-карты для данных, так как индексы кластеризации не являются непрерывными. Ниже приведены некоторые варианты обработки многокластикционных данных:
- Выполните всю фильтрацию самостоятельно в шейдере пикселей. К сожалению, это обычно нецелесообразно по причинам производительности.
- Если текстуры имеют низкое разрешение и не обладают MIP-картированием (т. е. световые карты), скорее всего, будет эффективнее просто вычислить освещение непосредственно в пространстве текстуры, где фильтрация происходить не будет, и отрисовать объект с затененной текстурой. Это, по сути, динамическая карта света, созданная полностью на GPU.
- Если используется атлас текстур (см. использование UVAtlas (Direct3D 9)), можно вручную кластеризовать сцену так, чтобы все векторы передачи в соединённом компоненте в текстурном пространстве находились в одном кластере. Таким образом, вы можете фильтровать текстуру, так как доступ ко всем текселям будет в одном кластере по конструкции. Идентификатор кластера для заданной поверхности может передаваться из шейдера вершин.
Шейдеры пикселей имеют гораздо меньше регистров констант, которые нельзя индексировать, поэтому шейдер пикселей несколько отличается от шейдера вершин. Хранение работы для каждого кластера в динамической текстуре с низким разрешением и использование загрузки текстур будет наиболее эффективным способом отрисовки при использовании нескольких кластеров.
Связанные разделы
-
симулятор PRT (prtcmdline.exe)