Моя цель - объединить несколько текстур рядом.Сначала я решил эту проблему, создав один квад и нарисовал несколько квадратов разных текстур несколько раз друг за другом.Однако это вызывает много вызовов отрисовки, которые я хотел бы уменьшить.Поэтому я подумал, что мог бы заранее скомбинировать текстуру на процессоре, и тогда потребовался только один вызов отрисовки!
void aggregateTextures(Texture* textures, int count)
{
//Height = height of tallest texture
//Width = accumulated with of textures
int newW = 0, newH = 0;
for (int i = 0; i < count; i++)
{
if (textures[i].height > newH)
newH = textures[i].height;
newW += textures[i].width;
}
//Container for data with the accumulated size of the textures (bytes)
unsigned char* newData = new unsigned char[newH*newW*textures[0].nrChannels];
unsigned int totalWidthLen = newW * textures[0].nrChannels;
for (int h = 0; h < newH; h++)
{ //For each row, do
unsigned int offset = 0;
//Add columns of this row for each texture to newData
for (int i = 0; i < count; i++)
{
unsigned int widthLen = textures[i].width*textures[i].nrChannels;
for (int w = 0; w < widthLen; w++)
{// Use offset to not add multiple times into the same index
if (textures[i].height < h+1) //If height of the current texture is less than the current row (i.e. height)
newData[h*totalWidthLen+offset+w] = 0xFF;
else
newData[h*totalWidthLen + offset + w] = textures[i].data[h*widthLen + w];
}
offset += widthLen;
}
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, newW, newH, 0, GL_RGB, GL_UNSIGNED_BYTE, newData);
delete[] newData;
}exImage2D(GL_TEXTURE_2D, 0, GL_RGB, newW, newH, 0, GL_RGB, GL_UNSIGNED_BYTE, newData);
delete[] newData;
}
Алгоритм перебирает каждый пиксель текстуры и помещает их в новый массив так, что результатэто текстуры, расположенные рядом.Это быстро масштабируется, как вы можете себе представить.К моему удивлению, это вызвало заметные «лаги» при запуске алгоритма, а не рисование нескольких квадов с разными текстурами. Итак, мой вопрос:
Я считаю, что есть лучший способ, чем рисовать несколько четырехугольников с разными текстурами.Но что я мог сделать, чтобы объединить текстуры более эффективно и уменьшить количество вызовов отрисовки?