Несколько текстур 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*
массив 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.
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;