Получить ID3DXMesh из CDXUTSDKMesh

В демонстрационном приложении DirectX 11 я использую CDXUTSDKMesh для моей статической геометрии. Он загружен и уже отображается.

Я делаю некоторые эксперименты, связанные с предварительно вычисленной передачей сияния в этом приложении. ID3DXPRTEngine будет довольно удобным инструментом для работы. К сожалению, D3DX и DXUT, похоже, не очень совместимы там.

ID3DXPRTEngine требует одного ID3DXMesh (несколько ячеек могут быть объединены с D3DXConcatenateMeshes нет проблем). Есть ли простой способ "конвертировать" CDXUTSDKMesh к одному или нескольким ID3DXMesh случаи?

1 ответ

Решение

Краткий ответ: Нет.

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

По сути, вы пытаетесь взаимодействовать с двумя разными версиями Direct3D API: версия 9.0 и версия 11.0. Для этого вам необходимо сделать следующее:

  1. Подтвердите, что ваши вершины не содержат пользовательской семантики (например, D3D11 допускает семантическое подобие RANDOM_EYE_VECтогда как D3D9 нет).

  2. Убедитесь, что у вас есть возможность считывать информацию о вашей вершине и лице в байтовый буфер (то есть указатель на символ).

  3. Создайте устройство Direct3D 9 и устройство Direct3D 11.

  4. Откройте вашу сетку, вытяните данные в байтовый буфер и создайте ID3DXMesh объект из этих данных. Если у вас более 2^16 граней, вам нужно разделить сетку на две или более сеток.

  5. Создайте движок PRT из сетки (-ей) и выполните вычисления PRT.

  6. Прочитайте новую информацию из сетки, используя ID3DXBaseMesh::GetVertexBuffer() (не уверен, что этот шаг полностью правильный, так как я никогда не использовал движок PRT).

  7. Запишите новые данные обратно в CDXUTSDKMesh,

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

Кроме того, если ваша сетка имеет какую-либо пользовательскую семантику (то есть вы используете шейдер, который ожидает некоторые данные, которые не были частью мира D3D9), тогда этот алгоритм потерпит неудачу. Движок PRT использует конвейер фиксированных функций, поэтому любые новые меши, использующие преимущества функций D3D11, которых тогда не было, здесь работать не будут.

Другие вопросы по тегам