Что происходит с пикселями после передачи их в glTexImage2D ()? - PullRequest
9 голосов
/ 20 апреля 2009

Если, например, я создаю массив пикселей, например, так:

int *getPixels()
{
    int *pixels = new int[10];
    pixels[0] = 1;
    pixels[1] = 0;
    pixels[1] = 1;
    // etc...
}

glTexImage2D(..., getPixels());

Использует ли glTexImage2D эту ссылку или копирует пиксели в свою собственную память?

Если ответ первый, тогда я должен сделать следующее?

int *p = getPixels();
glTexImage2D(..., p);

/* Just changed to delete[], because delete
 * would only delete the first element! */
delete[] p;

Ответы [ 3 ]

9 голосов
/ 20 апреля 2009

Из этой цитаты на справочной странице похоже, что glTexImage2D выделяет собственную память. Это имело бы смысл, в идеале API OpenGL отправлял бы данные для хранения на самой видеокарте (если драйверы / реализация / и т. Д.)

В GL версии 1.1 или выше пиксели могут быть нулевым указателем. В этом случае память текстур выделяется для размещения текстуры ширина ширина и высота высота. Затем вы можете загрузить подтексты в инициализировать эту текстуру памяти. Изображение не определено, если пользователь пытается применить неинициализированную часть текстуры изображение в примитив.

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

1 голос
/ 20 апреля 2009

Да, после возврата на geTexImage2D() можно безопасно сбросить данные, которые вы ему передали. на самом деле, если вы этого не сделаете, у вас будет утечка памяти, как в этом коде:

int *getPixels()
{
    int *pixels = new int[10];
    pixels[0] = 1;
    pixels[1] = 0;
    pixels[1] = 1;
    // etc...
}

glTexImage2D(..., getPixels());

Вы передаете указатель на буфер в вызов, но затем указатель теряется и, скорее всего, протекает. Что вам нужно сделать, это сохранить его и удалить после повторных вызовов:

int *pbuf = getPixels();
glTexImage2D(..., pbuf);
delete[] pbuf;

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

{
    int buf[10];
    ...
    glTexImage2D(..., pbuf);
}

Наконец, если вы не хотите беспокоиться об указателях и массивах, вы можете использовать STL:

vector<int> buf;
fillPixels(buf);
getTexImage2D(..., buf.begin());
0 голосов
/ 16 декабря 2011

Я думаю, что вам нужно вызвать glDeleteTextures () после того, как вы закончите рисовать свои пиксели, чтобы освободить память.

...