Как динамически отслеживать текстурные блоки в OpenGL? - PullRequest
0 голосов
/ 01 мая 2018

В настоящее время я создаю класс текстур для проекта, над которым я работаю, и пытаюсь с самого начала хорошо создавать вещи, чтобы предотвратить будущие головные боли.

В настоящее время я могу загрузить информацию о текстуре в графический процессор следующим образом:

void Texture::load_to_GPU(GLuint program)
{
    if(program == Rendering_Handler->shading_programs[1].programID)
        exit(EXIT_FAILURE);
    glUseProgram(program);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, textureID);

    GLint loc = glGetUniformLocation(program, "text");
    if(loc == GL_INVALID_VALUE || loc==GL_INVALID_OPERATION)
    {
        cerr << "Error returned when trying to find texture uniform."
            << "\nuniform: text"
            << "Error num: " << loc
            << endl;
        return;
    }

    glUniform1i(loc,0);
}

Однако я хотел бы иметь возможность динамически определять единицу текстуры.

Например, вместо жесткого кодирования унифицированного имени «текст», я хотел бы передать строку в качестве аргумента и сделать что-то похожее на glGetUniformLocation(), но для текстурных единиц.

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

Для этого мне нужно найти текстурный блок, который в данный момент не используется, в идеале от наименьшего до самого большого текстурного блока.

Какой набор функций OpenGL я мог бы использовать для достижения этого поведения?

EDIT:

Важный инструмент, который мне нужен для достижения желаемого поведения, которое, как мне кажется, неясно из исходного поста:

Как только единица текстуры будет привязана к униформе сэмплера, я бы хотел иметь возможность связать единицу текстуры с униформой.

Так что, если текстурный блок 5 привязан к единой "sampler2d texture_5"

Мне нужна функция, которая принимает унифицированную метку и возвращает единицу текстуры, привязанную к этой метке.

1 Ответ

0 голосов
/ 01 мая 2018

Я предполагаю, что у вас есть все привязки / развязки текстур.

Если это так, вы можете использовать следующий подход для выделения и освобождения текстурных блоков за время O (1), используя память O (n).

(Я нигде не видел такого подхода и не знаю названия этой структуры данных. Если кто-нибудь знает, как она называется, я был бы признателен за информацию.)

constexpr int capacity = 64; // A total number of units.
int size = 0; // Amount of allocated units.

std::vector<int> pool, indices;

void init()
{
    pool.resize(capacity);
    std::iota(pool.begin(), pool.end(), 0);
    indices.resize(capacity);
    std::iota(indices.begin(), indices.end(), 0);
}

int alloc()
{
    if (size >= capacity)
        return -1; // No more texture units.
    return pool[size++];
}

void free(int unit)
{
    // assert(indices[unit] < size) - if this fails, then you have a double free
    size--;
    int last_unit = pool[size];
    std::swap(pool[indices[unit]], pool[size]);
    std::swap(indices[unit], indices[last_unit]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...