Несколько текстур OpenGL GLUT C ++ - PullRequest
8 голосов
/ 16 апреля 2011

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

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

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

glDisable(GL_TEXTURE_2D);

Метод Draw:

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, 

image.data);}

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

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

Ответы [ 3 ]

17 голосов
/ 16 апреля 2011

Итак. 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.

0 голосов
/ 16 апреля 2011

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

GLsizei num_textures = 5;
GLuint textures[num_textures];

glGenTextures(num_textures, textures);

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

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

GLuint* textures = new GLuint[num_textures];

Обязательно удалите массив позже:

delete textures;
0 голосов
/ 16 апреля 2011

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

GLuint textureIDs = new GLuint [n];

glGenTextures (n, textureIDs);

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