Улучшить производительность алгоритма обработки текстур? - PullRequest
0 голосов
/ 30 сентября 2018

Моя цель - объединить несколько текстур рядом.Сначала я решил эту проблему, создав один квад и нарисовал несколько квадратов разных текстур несколько раз друг за другом.Однако это вызывает много вызовов отрисовки, которые я хотел бы уменьшить.Поэтому я подумал, что мог бы заранее скомбинировать текстуру на процессоре, и тогда потребовался только один вызов отрисовки!

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;
    }

Алгоритм перебирает каждый пиксель текстуры и помещает их в новый массив так, что результатэто текстуры, расположенные рядом.Это быстро масштабируется, как вы можете себе представить.К моему удивлению, это вызвало заметные «лаги» при запуске алгоритма, а не рисование нескольких квадов с разными текстурами. Итак, мой вопрос:

Я считаю, что есть лучший способ, чем рисовать несколько четырехугольников с разными текстурами.Но что я мог сделать, чтобы объединить текстуры более эффективно и уменьшить количество вызовов отрисовки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...