И так, есть массив вершин, массив нормалей и массив индексов. В вершинном массиве есть дублируемые вершины, убираю их, пересчитываю индексы и требуемый результат не получается - проблемы с освещением. Какие есть методы, чтобы и массив вершин был оптимальным и освещение не нарушалось?
Считать правильно.
slava_mib
> Считать правильно.
:) Будьте так любезны, на примере обычного кубика покажите как правильно. Когда vertices - 24, indices - 24, normal - 24 все нормально, а вот когда vertices - 8 появляются проблемы ...
А почему в массиве вершин есть дублируемые вершины?
Не должно быть такого.
Вот как раз в массиве индексов должны быть одинаковые индексы.
И я, полагаю, не нужно отдельно выделять массив нормалей.
Должно быть что-то такое:
struct Vertex { vec3 p, n; ... }; struct Face { unsigned index[3]; };
Elsedar
> А почему в массиве вершин есть дублируемые вершины?
> Не должно быть такого.
> Вот как раз в массиве индексов должны быть одинаковые индексы.
Согласен, полностью...
Elsedar
> И я, полагаю, не нужно отдельно выделять массив нормалей.
Получается так, что одна вершина может принадлежать разным полигонам и иметь разные нормали...и в этом проблема
Обычно для каждой вершины берут 1 нормаль, чтобы не было резких границ на полигонах при освещении.
Например, возьми среднюю нормаль для каждой вершины: суммируй все нормали и потом нормализуй результат.
RigoN
> В вершинном массиве есть дублируемые вершины
Не вершины, а позиции вершин, что не то же самое.
и они вполне допустимы. если например на смежных полигонах разные текстуры должны быть
Elsedar
RigoN
а теперь когда у вас нет дублируемых вершин затекстурьте модель вашу.
и будете опять эти вершины возвращать.
PlatinumKiller
И в чем проблема?
RigoN
Для куба писать долго, вот плоскость на вскидку:
verts[0].pos = vec2(0, 0);; verts[1].pos = vec2( 10, 0); verts[2].pos = vec2( 10, 10); verts[3].pos = vec2( 0, 10); inds[0] = 0; inds[1] = 1; inds[2] = 2; inds[3] = 0; inds[4] = 2; inds[5] = 3;
Квад двумя треугольниками без дублирования вершин...
Озвучь проблему поподробнее, а то не совсем понятно что у тебя не получается...
PlatinumKiller
> а теперь когда у вас нет дублируемых вершин затекстурьте модель вашу.
>
> и будете опять эти вершины возвращать.
Само собой, где вершины имеют разные атрибуты, совмещать не надо...
Executor
> Озвучь проблему поподробнее, а то не совсем понятно что у тебя не получается...
Да нет, все получается, просто решил поэкспериментировать в вопросе оптимизации мешей..., были некоторые сомнения по индексам, но...
Executor
> Само собой, где вершины имеют разные атрибуты, совмещать не надо...
Изначально, тоже так думал, да и сейчас пока так и делаю, но вот здесь(http://wingman.org.ru/opengl/vertex-arrays) заинтересовало меня :
>Единственный минус - когда мы загружаем 3д обьект, обычно в файле больше текстурных
>координат и/или нормалей, чем вершин. Но вы не можете указать разные массивы для
>разных типов данных (вершина, текст. координаты, и т.д.). Это расплата за рендер
>всей информации с использованием массивов вершин. Так что вершины отрисуются прекрасно,
>но текстуры будут выглядеть забавно.
>Чтобы обойти эту ситуацию, у вас есть две возможности.
> 1) Первая - пройтись циклом и просто дублировать вершинные данные и поместить их
>в структуру типа CVertex (см. ниже в уроке), которая содержит вершину, текстурные координаты и
>нормали. Это, конечно, увеличит использование памяти, но при долгой работе (если возрошшая память
>не проблема для вашего компьютера) рендер будет быстрее.
> 2) Второй метод - создать структуру, содержащую эту информацию, но установить
>ваши данные так, чтобы рендер проходил с использованием "шагов треугольника".
>Много игр это делают, и результат всегда быстр. Вы можете посмотреть урок
>"загрузка Quake BSP", чтобы увидеть этот процесс в действии.
Вот и решил в такой незатейливой форме поднять вопрос оптимизации мешей, очень интересно услышать, кто как оптимизирует, или "забивает" на это....
RigoN
Я так понял у них там индексы разные для позиций и текстурных координат... Я просто дублирую вершину в таком случае...
Я недавно задавал подобный вопрос http://www.gamedev.ru/code/forum/?id=120928
Думаю надо грузить оптимизированные вершины и индексы, а нормали брать неоптимизированные. У меня тоже была ета проблема со светом.
Для куба 24 вершины - это НОРМА.
Т.к. должно быть 24 нормали.
Вершина являеться лишней, если она полностью дублирует другую вершину.
В случае куба так не происходит.
Тема в архиве.