Получить ID3DXMesh из CDXUTSDKMesh
В демонстрационном приложении DirectX 11 я использую CDXUTSDKMesh
для моей статической геометрии. Он загружен и уже отображается.
Я делаю некоторые эксперименты, связанные с предварительно вычисленной передачей сияния в этом приложении. ID3DXPRTEngine
будет довольно удобным инструментом для работы. К сожалению, D3DX и DXUT, похоже, не очень совместимы там.
ID3DXPRTEngine
требует одного ID3DXMesh
(несколько ячеек могут быть объединены с D3DXConcatenateMeshes
нет проблем). Есть ли простой способ "конвертировать" CDXUTSDKMesh
к одному или нескольким ID3DXMesh
случаи?
1 ответ
Краткий ответ: Нет.
Длинный ответ: это можно сделать, но для этого необходимо, чтобы вы могли читать необработанные данные вершин, преобразовывать их в систему Direct3D 9 FVF (старый конвейер фиксированных шейдеров) и записывать новые данные обратно.
По сути, вы пытаетесь взаимодействовать с двумя разными версиями Direct3D API: версия 9.0 и версия 11.0. Для этого вам необходимо сделать следующее:
Подтвердите, что ваши вершины не содержат пользовательской семантики (например, D3D11 допускает семантическое подобие
RANDOM_EYE_VEC
тогда как D3D9 нет).Убедитесь, что у вас есть возможность считывать информацию о вашей вершине и лице в байтовый буфер (то есть указатель на символ).
Создайте устройство Direct3D 9 и устройство Direct3D 11.
Откройте вашу сетку, вытяните данные в байтовый буфер и создайте
ID3DXMesh
объект из этих данных. Если у вас более 2^16 граней, вам нужно разделить сетку на две или более сеток.Создайте движок PRT из сетки (-ей) и выполните вычисления PRT.
Прочитайте новую информацию из сетки, используя
ID3DXBaseMesh::GetVertexBuffer()
(не уверен, что этот шаг полностью правильный, так как я никогда не использовал движок PRT).Запишите новые данные обратно в
CDXUTSDKMesh
,
Как вы можете сказать, этот процесс длительный, подвержен ошибкам и очень медленный. Если вы делаете это для автономного инструмента, это может быть хорошо, но если это будет использоваться в режиме реального времени, вам, вероятно, лучше написать свой собственный движок PRT.
Кроме того, если ваша сетка имеет какую-либо пользовательскую семантику (то есть вы используете шейдер, который ожидает некоторые данные, которые не были частью мира D3D9), тогда этот алгоритм потерпит неудачу. Движок PRT использует конвейер фиксированных функций, поэтому любые новые меши, использующие преимущества функций D3D11, которых тогда не было, здесь работать не будут.