Нужно ли вызывать glGenTextures и glBindTexture перед выполнением glTexImage2D и glTexSubImage2D

Привет, у меня есть 35 изображений для рисования на дисплее. Я рисую в сетке 7х5. Изображения скачаны из интернета. Каждый раз, когда загружается изображение, я пытаюсь нарисовать все 35 изображений. Но некоторые из них еще не загружены. Поэтому вместо этого я рисую для них плитку по умолчанию. Проблема в том, что каждый раз, когда загружается изображение, я снова рисую ранее нарисованные изображения. Я хочу уменьшить его. Поэтому я подумал о том, чтобы сделать что-то вроде Атласа текстур. Я пытаюсь сделать это вручную. Я делаю это, создавая большое изображение с помощью glTexImage2D и добавляя к нему части изображения с помощью glTexSubImage2D.

glGenTextures(1, tex);
glBindTexture(GL_TEXTURE_2D, (*tex));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, textureImageInfo->format, textureImageInfo->texWidth, textureImageInfo->texHeight, 0, textureImageInfo->format, GL_UNSIGNED_BYTE, NULL);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, textureImageInfo->imageWidth, textureImageInfo->imageHeight, textureImageInfo->format, GL_UNSIGNED_BYTE, textureImageInfo->image);

Я вызываю 35 glTexSubImage2D, чтобы добавить все 35 изображений в большой glTexImage2D. Здесь я написал только один для облегчения объяснения. Тогда, наконец, я делаю

glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, this->tileCoordList); 
glTexCoordPointer(3, GL_FLOAT, 0, this->tileTextureCoordList);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

Теперь меня смущает то, что мне нужно генерировать и связывать текстуры 35 раз для 35 вызовов glTexSubImage2D ?? Или достаточно сделать один раз. Настоящая проблема, я не понимаю, что связывает текстуру с ней. Спасибо.


person Tahlil    schedule 08.03.2013    source источник
comment
Если у вас есть только одна текстура, вам нужно получить только одно имя текстуры из glGenTextures() и один вызов glBindTexture().   -  person rhashimoto    schedule 08.03.2013
comment
поэтому мне нужно 35 вызовов glGenTextures() здесь? Поскольку я добавляю 35 фрагментов текстур с помощью glTexSubImage2D.   -  person Tahlil    schedule 08.03.2013
comment
Нет. У вас одна текстура. glTexSubImage заполняет часть вашей текстуры.   -  person rhashimoto    schedule 08.03.2013
comment
Что касается настоящей проблемы, я не понимаю, что связывает текстуру с ней., Я слишком часто отвечал на отвечайте снова и снова.   -  person Nicol Bolas    schedule 08.03.2013


Ответы (1)


В текстуре нет такого понятия, как «частичное изображение». В текстуре есть только изображения. glTexImage2D выделяет память для определенного изображения в текстуре и при необходимости загружает данные в это изображение. glTexSubImage2D загружает данные только в изображение. "Под" означает, что вы можете обновить часть изображения, не обязательно все.

glTexImage2D похоже на malloc, за которым следует memcpy. glTexSubImage2D это просто memcpy. Вот почему вы должны сначала позвонить glTexImage2D.

person Nicol Bolas    schedule 08.03.2013