Текстуры кажутся белыми в OpenGL
Я не могу загрузить BMP texture
и показать это на лицах куба.
Я работаю над Windows 7
Мой компилятор Visual Studio 2010 Express
.Я использую FreeImage
для загрузки bmp.Моя глубина изображения составляет 24.Мой размер изображения составляет 256 * 256.Я использую SDL
создать окно и обрабатывать события.
Когда я компилирую и запускаю программу, мой куб все еще белый, и на его лице ничего не отображается. Я загружаю текстуру в GLuint
переменная. Когда я печатаю эту переменную, она печатает только "1". Один из моих друзей сказал мне, что моя графическая карта несовместима с этой версией OpenGL
Так что я скомпилировал и запустил программу в Ubuntu
на виртуальной машине, и он работал нормально. Куб был успешно текстурирован. Можете ли вы помочь мне запустить его на моем Windows
propely?
И если вам нужна моя графическая карта NVIDIA GT240 DDR5
,
РЕДАКТИРОВАТЬ
Это моя функция initgl:
//OpenGL initialization.
int initGL(void)
{
glEnable(GL_TEXTURE_2D); //Enable texture mapping.
if(!loadGLTextures("bmp_24.bmp"))
return false;
glShadeModel(GL_SMOOTH);
glClearColor(0.0f , 0.0f , 0.0f , 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
//Nice perspective.
glHint(GL_PERSPECTIVE_CORRECTION_HINT , GL_NICEST);
return true;
}
И это функция, которая загружает текстуру image.GLuint [1], которая была определена ранее:
//This function will load a bitmap image.
bool loadGLTextures(const char* file)
{
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
fif = FreeImage_GetFileType(file , 0);
if(fif == FIF_UNKNOWN)
fif = FreeImage_GetFIFFromFilename(file);
if(fif == FIF_UNKNOWN)
return false;
FIBITMAP* dib = FreeImage_Load(fif , file);
if(!dib)
return false;
//Create the texture.
glGenTextures(1 , &texture[0]);
//Typical texture generation using data from the bitmap.
glBindTexture(GL_TEXTURE_2D , texture[0]);
//Generate the texture.
glTexImage2D(GL_TEXTURE_2D , 0 , GL_RGB , FreeImage_GetWidth(dib) ,
FreeImage_GetHeight(dib) , 0 , GL_BGR_EXT , GL_UNSIGNED_BYTE ,
FreeImage_GetBits(dib));
//Linear filtering.
glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR);
printf("%d" , texture[0]);
FreeImage_Unload(dib);
return true;
}
И это моя функция рендеринга:
//All of the drawing goes through this.
int drawGLScene(void)
{
static float xrot = 0 , yrot = 0 , zrot = 0;
//Clear screen and depth buffer.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f , 0.0f , -5.0f);
glRotatef(xrot , 1.0f , 0.0f , 0.0f);
glRotatef(yrot , 0.0f , 1.0f , 0.0f);
glRotatef(zrot , 0.0f , 0.0f ,1.0f);
//Select the texture.
glBindTexture(GL_TEXTURE_2D , texture[0]);
glBegin(GL_QUADS);
//Front:
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
//Bottom right fo the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , 1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
//Back:
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
//Top right of the texture and the quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
//Top left of the texture and the quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
//Top:
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
//Bottom:
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , -1.0f , 1.0f);
//Right:
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(1.0f , -1.0f , 1.0f);
//Left:
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
glEnd();
SDL_GL_SwapBuffers();
xrot += 0.1;
yrot += 0.1;
zrot += 0.1;
return true;
}
3 ответа
Есть несколько вещей, которые могут пойти не так в вашем коде.
Я подозреваю, что вы звоните initGL()
преждевременно, т. е. пока не доступен контекст. Вы не показывали этот код, поэтому я могу только догадываться об этом.
Включение блока текстурирования важно только для рисования. Вы можете загрузить данные текстуры с отключенным модулем текстуры. Я настоятельно рекомендую вам поставить это glEnable(GL_TEXTURE_2D);
прямо перед вашим четырехмерным кодом для рисования и нигде больше (на самом деле вы должны только вызывать glEnable и glDisable только в код для рисования по нескольким причинам).
Загружая текстуру, вы не можете выполнить несколько проверок работоспособности. Также вы забудете правильно установить параметры хранилища пикселей, но это сделает вашу текстуру искаженной. Также имеет смысл возвращать идентификатор текстуры из функции загрузки вместо логического значения и помещать идентификатор в глобальную переменную. Texuture ID 0 зарезервирован, поэтому вы можете использовать его, чтобы указать на ошибку.
Вы устанавливаете режим фильтра, так что это не проблема, когда уровни mipmap не определены.
Ваши размеры текстуры могут не быть степенью двойки, то есть 1, 2, 4, 8, 16, 32, 64 и так далее.
Это также может вызвать такую проблему на некоторых аппаратных средствах, как правило, на старых.
Ура;)
GL_TEXTURES_2D
должен быть включен перед созданием текстур, поэтому вам нужно вызвать glEnable(GL_TEXTURE_2D);
перед звонком glGenTextures(1 , &texture[0]);
Также, чтобы включить прозрачность, вам нужно вызвать `glEnable(GL_BLEND);`
Тем не менее, это не объясняет, почему он работает в Ubuntu, а не в Windows... Я бы сказал, попробуйте и посмотрите, поможет ли это.
РЕДАКТИРОВАТЬ: Теперь вы опубликовали свою функцию рендеринга, я заметил, что вы не устанавливаете цвет рендеринга. Попробуйте позвонить
glColor4f(r,g,b,a); // r, g, b and a are float between [0,1], specifying your desired color
где-то между glLoadIdentity();
и ваш первый glVertex3f
вызов