Добавление нормалей в список вершин - PullRequest
0 голосов
/ 30 января 2012

Я использую DirectX 9 в C #
Я храню все свои вершины в списке (не в массиве), потому что я использую алгоритм динамического LOD, поэтому все рассчитывается для каждого кадра, поэтому мои вершины потенциально могут отличаться в каждом кадре,

Все работало нормально, пока я не попытался добавить нормали и освещение.
Я обнаружил, что вы не можете редактировать нормаль после добавления вершины в список, потому что это скорее список структур, чемклассы.Так что он просто выдает ошибку вроде «не могу изменить возвращаемое значение blablaba, потому что это не переменная»
Например, если я попытался это сделать, это не сработает -

vertices[i].Normal = new Vector3(0, 1, 0);

Нормали должны быть добавлены, когда вершина помещена в список, но вы не можете вычислять нормали, пока у вас не будет полной сетки.

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

Итак, я попытался заставить его работать с массивами вместо списка вершин.Это привело к тому, что было менее одного кадра в секунду.Мне пришлось использовать Array.Resize, чтобы изменить размер моего массива несколько сотен раз за кадр, и, думаю, это не понравилось.

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

Так как я могу сохранить своивершины таким образом, чтобы я мог дать им нормали после того, как построил свою сетку?

1 Ответ

1 голос
/ 30 января 2012

C # не позволяет вам писать vertices[i].Normal = new Vector3(0, 1, 0), потому что это выражение не будет делать то, что вы хотели. В отличие от индексатора массива, индексатор List<T> возвращает копию указанного элемента, и поскольку вершина является структурой, вся вершина копируется, Normal и все. Вы будете обновлять временную копию вершины, а не фактическую вершину, которая находится внутри списка.

Обходной путь - получить (копию) вершины из списка, обновить ее и поместить (копию) обратно:

var vertex = vertices[i];
vertex.Normal = new Vector3(0, 1, 0); 
vertices[i] = vertex;

К сожалению, нет простого способа избежать повторного копирования.

...