Несколько текстур OpenGL GLUT C++

хорошо, все еще есть несколько проблем с ним, это то, что у меня есть до сих пор:

Bitmap Display::m_HeightMap;
unsigned int Display:: textures;

мой метод инициализации:

 glEnable(GL_TEXTURE_2D);

Bitmap image[2];
GLuint *textures = new GLuint[2];
glGenTextures(1, textures);
glGenTextures(2, textures);
image[0].loadBMP("myTexture.bmp");
image[1].loadBMP("myOtherTexture.bmp");  

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

приведенная выше строка дает ошибку: слева .данные должны иметь class/ struct / union

glDisable(GL_TEXTURE_2D);

Метод Рисования:

void Draw()
{
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS); //TOP
glBindTexture(GL_TEXTURE_2D, textures[0]);
glNormal3f(0,1,0);
glColor4f(1,1,1,0);
//glColor3d(0.5,0.40,0.05);
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();
glDisable(GL_TEXTURE_2D);
}

единственная проблема здесь в том, что текстура не определена.

одна последняя вещь, мы надеемся!

void loadTexture(GLuint texture, const char* filename)
{
   Bitmap image;

   Bitmap image[2];

   image[0].loadBMP("myTexture.bmp");  <=== error 
   image[1].loadBMP("myTexture2.bmp"); <=== error


   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, 

изображения.данные); }

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

ошибка C2040: image:' Bitmap [2] 'отличается уровнем косвенности'Bitmap'
ошибка C2088: '['незаконно для класса (дважды)
ошибка C2228: слева .BMP должен иметь class/struct / union (дважды)
ни один оператор "[] " не соответствует этим операндам (дважды)

3 ответов


так. glGenTextures принимает два параметра. Ан int и GLuint*. The int сообщает GL, сколько текстур для генерации, и GLuint* массив GLuints (где генерировать текстуры). Причина, по которой Вы делаете следующее...

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.


const GLsizei n = (количество текстур здесь);

GLuint textureIDs = новый GLuint[ n];

glGenTextures (n, textureIDs );


Я предполагаю, что вы хотите создать несколько текстур и сохранить id в массиве? Вы можете сделать это так:

GLsizei num_textures = 5;
GLuint textures[num_textures];

glGenTextures(num_textures, textures);

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

вы можете создать свой массив текстур в куче, чтобы получить доступ к идентификаторам текстур позже:

GLuint* textures = new GLuint[num_textures];

просто убедитесь, что удалить массив позже:

delete textures;