У меня есть криволинейная поверхность, определяемая количеством треугольных граней.Вся поверхность имеет один цвет.
До сих пор я рисовал каждый треугольник отдельно.Для каждого треугольника я проходил 3 вершины, 3 индекса, 3 цветовых значения (одного цвета) и 3 нормальных значения (все равны нормали поверхности треугольника).Затем я вставил бы все эти массивы в VBO и отобразил бы изогнутую поверхность.
Недавно я понял, что это довольно расточительно по сравнению с текстурным методом рендеринга.Теперь я создаю текстуру из массива пикселей 2x2 (все того же цвета, который я хочу для изогнутой поверхности).Затем я вычисляю координаты текстуры (s, t) для всех вершин на кривой поверхности.Таким образом, я эффективно растягиваю текстуру размером 2х2 пикселя, чтобы подогнать ее к своей изогнутой поверхности.Это работает довольно хорошо, для некоторых поверхностей.Также для этого требуются буферы гораздо меньшего размера (потому что теперь вершины имеют только одно нормальное значение и значение цвета, поэтому они должны быть упомянуты только один раз).Однако с помощью этого метода иногда изогнутая поверхность вообще не рендерится.Мое подозрение в том, как я вычисляю координаты текстуры.Ничего страшного, если поверхность слегка изогнута, но когда поверхность вращается вокруг оси и образует замкнутую границу, координаты текстуры, похоже, сбивают с толку графическую карту.
Мой вопрос: какой путь рекомендуется использовать в OpenGL ES, рисования поверхностей одним цветом?
ОБНОВЛЕНИЕ - Объяснение принятия ответа
Мне потребовалось некоторое время, чтобы понять, как будет работать ответ genpfault.Итак, вот объяснение.Выше я описал два метода рисования однотонных поверхностей - 1. использование значений цвета rgba, 2. использование текстур, которые имеют один цвет.Ответ genpfault объясняет, как эффективно реализовать метод 1.
Я реализовал первый метод, передавая одинаковые значения цвета rgba на вершину несколько раз.Поэтому я читал это значение цвета в коде вершинного шейдера как атрибут.В методе genpfault мы устанавливаем цвет как однородную переменную перед вызовом drawArray / Elements.Это потребует изменения в вершинном шейдере для чтения значения из единой переменной вместо атрибута.