Yurich » 22.07.2007 (Вс) 14:59
1. Наконец обнаружил в DX трудноуловимую ошибку!
Долго не мог понять, почему после "ручной" загрузки х-файла некоторые плоскости отображаются треугольниками с неправильными нормалями. Файлы конвертились из *.3DS в *.х стандартным Conv3ds.exe. Причем ошибка исчезает после перезаписи файла с помощью mview.exe.
Для прорисовки использовал
D3DDevice.DrawIndexedPrimitive D3DPT_TRIANGLELIST
Теперь подробности. Сравни индексы полигонов куба до и после перезаписи файла:
до---------------------после
12;--------------------12;
3;0,3,2;,--------------3;0,3,2;,
3;3,0,1;,--------------3;3,0,1;,
3;4,7,5;,--------------3;4,7,5;,
3;7,4,6;,--------------3;7,4,6;,
3;8,10,9;,-------------3;8,10,9;,
3;11,13,12;,----------3;11,13,12;, до сюда одинаково.
3;1,7,14;,-------------3;26,27,14;, Зачем дополнительные вертексы!?
3;7,1,15;,-------------3;27,26,15;,
3;16,18,17;,----------3;16,18,17;,
3;19,21,20;,----------3;19,21,20;,
3;22,23,0;,------------3;22,23,28;, и тут тоже!
3;24,25,6;;------------3;24,25,29;; и тут тоже!
Всего во втором варианте добавлено 4 вертекса. Было 26 а стало 30. Спрашивается, для чего?
С принципиальной точки зрения в первом варианте никакой заморочки нет, но при отрисовке граней с индексами 1,7,14; 7,1,15; 22,23,0; 24,25,6 как раз и возникает ошибка в прорисовке. Собственно, DX рисует полигон, но при этом корёжит уже отрисованные предыдущие. Очевидно DrawIndexedPrimitive и ему подобные содержат в вертексном или индексном буфере какой-то счетчик, который "не опрокидывается назад". То есть, если ранее (в одном проходе) рисовался полигон с индексами 11,13,12 , то индексы следующего не должны быть меньше 11.
Парадокс, но факт!
Имейте это ввиду при попытке сэкономить на вертексах.
Замечено, что если загрузить меш чисто средствами DX, и потом попытаться вытащить вертексный и индексный буферы, то выдан будет подправленный вариант, а не тот, что записан в файле.
Похоже, избежать возникновения ошибки можно используя параметры MinIndex и NumIndices , только как это сделать в одном проходе? Собственно, я так и не въехал в их смысл. Поясните, плз!
2. В массив вертексов загружаю из бинарного файла координаты. Тип, как известно, Single. Пытаюсь выполнить их преобразование - самое обычное присваивание другой переменной того же типа. Вылетает ошибка переполнения. На поверку значение оказывается =-1.#QNAN0. Я чуть не упал со стула!
Просматриваю текстовый формат того же файла и вижу, что некоторые поля заполнены той же бурдой. Кто в этом виноват, VB, конвертер или оба. Кстати mview.exe бинарный формат грузит, а текстовый нет. После перезаписи ошибка исчезает.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!