Итак. glGenTextures
принимает два параметра. int
и GLuint*
. int
сообщает GL, сколько текстур генерировать, а GLuint*
- это массив GLuint
s (где генерировать текстуры). Причина, по которой вы делаете следующее ...
GLuint m_TextureID
glGenTextures(1, &m_TextureID)
потому что у вас есть только одна текстура. Если у вас есть более одного, вы бы сделали это:
// Substitute 'n' for some const number
GLuint *textures = new GLuint[n];
glGenTextures(n, textures);
Таким образом, вы говорите GL, что я хочу сгенерировать n текстур, а вот массив с выделенным пространством как минимум для такого количества текстур.
Скажем, вы хотите использовать их обоих в цикле отрисовки, вы бы реализовали это следующим образом:
void draw()
{
glBindTexture(GL_TEXTURE_2D, textures[0]); // Tell GL to use the first texture
// Any drawing here will use first texture
glBindTexture(GL_TEXTURE_2D, textures[1]); // Tell GL to use the second textures
// Any drawing here will use second texture
glBindTexture(GL_TEXTURE_2D, 0); // Set the GL texture to NULL, standard cleanup
}
Обязательно наберите delete textures;
в конце вашей программы для правильной очистки после выделения этого пространства.
Есть также способы не связывать отдельные текстуры. Вы можете использовать так называемый «текстурный атлас». По сути, это одно растровое изображение, которое содержит несколько вложенных изображений. Таким образом, вы просто генерируете и связываете одно растровое изображение и используете его отдельные части.
Чтобы справиться с несколькими растровыми изображениями, сделайте следующее:
Bitmap image[2];
image[0].loadBMP("myTexture.bmp");
image[1].loadBMP("myOtherTexture.bmp");
Затем выполните процесс создания одного растрового изображения для обоих растровых изображений.
Все, что находится ниже этой строки, отвечает на ваш обновленный вопрос.
Это должно в значительной степени делать то, что вы пытаетесь сделать.
// Global variable
GLuint textures[2];
// init function
void init()
{
textures = new GLuint[2];
glGenTextures(2, textures);
loadTexture(textures[0], "texture1.bmp");
loadTexture(textures[1], "texture2.bmp");
}
void loadTexture(GLuint texture, const char* filename)
{
Bitmap image;
image.loadBMP(filename);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE , GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image.width, image.height, GL_RGB, GL_UNSIGNED_BYTE, image.data);
}
// draw function
void draw()
{
glBegin(GL_QUADS); //TOP
glBindTexture(GL_TEXTURE_2D, textures[0]);
glNormal3f(0,1,0);
glColor4f(1,1,1,0);
glTexCoord2f(0.0f,0.0f); glVertex3f(-4.5, 0.3, 2); //bottom left
glTexCoord2f(1.0f,0.0f); glVertex3f(-4.5, 0.3, 2.5); //bottom right
glTexCoord2f(1.0f,1.0f); glVertex3f(4.5, 0.3, 2.5); //top right
glTexCoord2f(0.0f,1.0f); glVertex3f(4.5, 0.3, 2); //top left
glEnd();
}
// cleanup function
void cleanup()
{
delete textures;
}
Некоторые из проблем, на которые вы указали, связаны не только с OpenGL, они в большей степени связаны с C / C ++. Я знаю, что это не тот ответ, который вы ищете, но он, вероятно, поможет вам многое узнать о функциях C, указателях, массивах и т. Д. И потратить целый месяц на тесную работу с функциями / указателями / массивами перед перемещением. на что-то вроде OpenGL, что требует довольно умеренного понимания C.