Razum писал(а):
Кстати, как проблему смешивания-то решил?
Как и говорили - блендером. Сейчас без оптимизации, так что рисовка идёт слоями в прямом смысле этого слова - сколько текстур, столько раз карта и будет отрисована, причём полностью (с чем и собираюсь бороться).
А конкретнее:
1) Сначала рисую особую подложку для всей карты целиком:
а. подготовка:
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glDisable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA,GL_ZERO);
glColor4f(0,0,0,0);
б. Затем рисую всю карту методом GL_TRIANGLE_STRIP, задавая лишь вершины - это очень быстро, особенно если массивы вершин использовать. Так получается абсолютно чёрная карта, цвет которой {0,0,0,0}, т.е. она как бы прозрачна, но из-за особых параметров glBlendFunc всё, что за ней, будет перекрыто.
2) Слой за слоем перерисовываю карту, каждый раз привязывая следующую текстуру:
а. подготовка:
glEnable(GL_ALPHA_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
б. При задании каждой следующей вершины, рисуя методом GL_TRIANGLE_STRIP, определяя цвет, я беру RGB-компоненты из данных карты, а четвёртую, непрозрачность, я определяю так: если в вершине, что сейчас будет отрисована, номер текстуры совпадает с привязанной, альфа = 1; иначе - 0.
Вот для этого мне и нужно альфу отдельно задавать - перед прорисовкой вершины. Я не могу загнать значение альфы в массив цветовых данных, поскольку для одного монотекстурного слоя в данной вершине альфа будет 1, а для другого тут же - 0. Другой вариант - перед прорисовкой каждого слоя изменять альфу во всех вершинах. Думаю, так и придётся поступать...
Или можно копировать цветовой массив, прибавляя А-компоненту соответствующую, но это лишний засёр оперативы плюс изменения цветового массива карты не повлияет на её отображение, поскольку цвет берётся из своего массива. Жаль, что нельзя отдельно задать массивы RGB-компонент, и отдельно A-массив - так бы просто для каждого слоя создал бы отдельный массив из 0/1 и при его отрисовке указывал бы соответствующий массиво-указатель.
Ну а тормозит так потому, что перерисовка каждого слоя идёт по всей карте, рисуя ничто там, где должна быть другая текстура. Оптимизация - проанализировать всю карту и составить массивы индексов для каждого слоя. Этим и займусь, пожалуй...
Добавлено спустя 12 минут 52 секунды:
Т.е. я собираюсь каждый слой рисовать не по всей карте, а кусками, выборочно - лишь там, где он присутствует. Так двойная отрисовка будет лишь в местах, где слои накладываются.
Добавлено спустя 4 минуты 6 секунд:
Кстати говоря, если рисовать целыми слоями, то подложку можно совместить с рисованием первого слоя - тогда из вышеперечисленного нужно оставить лишь отключение альфа-теста и перенастройку блендера. Если оптимизированным способом - вот тогда без отдельного рисования подложки не обойтись.