Хорошо ... представьте, что у меня есть относительно простое тело, которое имеет шесть различных нормалей, но на самом деле имеет около 48 граней (8 граней в каждом направлении), и между гранями есть МНОГО общих вершин. Какой самый эффективный способ сделать это в OpenGL?
Я знаю, что могу поместить вершины в массив, а затем использовать индексный массив для их рендеринга, но я должен продолжать разбивать шаги рендеринга вниз, чтобы изменить нормали (то есть установить нормальные 1 ... рендерить 8 граней .. установить нормальное значение 2 ... отрисовать 8 граней и т. д.) Из-за этого я должен поддерживать массив индексных массивов ... по одному на каждую нормаль! Не хорошо!
Другой способ, которым я могу это сделать, - это использовать отдельные массивы нормалей и вершин (или даже чередовать их), но это означает, что мне нужно иметь отношение один к одному для нормалей к вершинам, и это означает, что нормали будут дублироваться В 8 раз больше, чем нужно! Для чего-то со сферической или даже изогнутой поверхностью все нормальности, скорее всего, различны, но для этого это действительно кажется пустой тратой памяти.
В идеальном мире я хотел бы, чтобы мои вершины и нормальные массивы имели разную длину, тогда когда я собираюсь нарисовать свои треугольники или четырехугольники, чтобы указать индекс для каждого массива для этой вершины.
Теперь формат файла OBJ позволяет вам точно указать, что ... массив вершин и обычный массив различной длины, а затем, когда вы указываете грань, которую вы визуализируете, вы указываете вершину и нормальный индекс (а также Координаты UV, если вы используете текстуры тоже), что кажется идеальным решением! 48 вершин, но только 8 нормалей, затем пары индексов, определяющих грани фигур. Но я не уверен, как сделать это в OpenGL ES (опять же, обратите внимание на «ES».) В настоящее время я должен «денормализовать» (извините за каламбур SQL там) нормали обратно к 1-к-1 с массив вершин, затем рендер. Просто трата памяти на меня.
Кто-нибудь поможет? Я надеюсь, что я упускаю что-то очень простое здесь.
Mark