Загружаю текстуру по книжке Краснова "OpenGL в проектах Delphi".
AssignFile(F,'test.bmp'); Reset( F,1); BlockRead( F,FileHdr,SizeOf( TBITMAPFILEHEADER)); BlockRead( F,InfoHdr,SizeOf( TBITMAPINFOHEADER)); Header := InfoHdr; ArraySize := FileSize( F)-SizeOf( TBITMAPFILEHEADER)-SizeOf( TBITMAPINFOHEADER); GetMem( p,ArraySize); BlockRead( F,p^,ArraySize); for i := 0 to InfoHdr.biWidth*InfoHdr.biHeight-1 do begin b := TByteArray( p^)[i].R; TByteArray( p^)[i].R := TByteArray( p^)[i].B; TByteArray( p^)[i].B := b; end; CloseFile( F);
Нечто подобное. Проверяю, в массиве растр есть. При применении процедуры glDrawPixels растр выводится корректно. Строю прямоугольник.
glEnable(GL_TEXTURE_2D); glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr); glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); wglMakeCurrent( WinDC,WinHRC); glColor3f( 0.7,0.6,0); glBegin( GL_TRIANGLES); glTexCoord2f( 0,0); glVertex2f( -0.5,-0.5); glTexCoord2f( 0,1); glVertex2f( -0.5,0.5); glTexCoord2f( 1,1); glVertex2f( 0.5,0.5); glTexCoord2f( 0,0); glVertex3f( -0.5,-0.5,0); glTexCoord2f( 1,1); glVertex3f( 0.5,0.5,0); glTexCoord2f( 1,0); glVertex3f( 0.5,-0.5,0); glEnd; glDisable( GL_TEXTURE_2D); SwapBuffers( WinDC); wglMakeCurrent( 0,0);
Получаю прямоугольник с цветом, установленным в glColor3f. Никакой текстуры. Что бы это могло быть?
может wglMakeCurrent(WinDC,WinHRC); в самое начало всё-таки поставить ? а то текстура неизвестно в каком контексте энейблится...
Ставил. Результат - EAcsessViolation.
А где glBindTexture?
glBindTexture - это разве не при работе с текстурными списками вызывается?
Black Phoenix
Там не надо, у него же одна текстура.
Vinil
> а то текстура неизвестно в каком контексте энейблится...
Почему неизвестно, известно - в нулевом :).
DimaO
А почему у тебя РГБА? Вроде битмап загружаешь.
Я ставил и GL_RGB. Результат один - не рисуется текстура и все. Битмап 24-битный RGB.
ExeLord
> Вроде битмап загружаешь.
Он альфу поддерживает.
> Битмап 24-битный RGB.
Сделяй 32 битный.
> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
Плохая запись. Правильней:
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
Обращаю внимание на цифру 3 - это число компонентов в текстуре.
Какой-то злобный метод загрузки текстур. Попробуй так:
unsigned GLTextureManager::LoadBMPTexture(char *texName) { if(AUX_RGBImageRec * temp_tex = auxDIBImageLoad ( texName )) { unsigned textureId; glGenTextures ( 1, &textureId ); glBindTexture ( GL_TEXTURE_2D, textureId ); glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 ); // set 1-byte alignment glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); // set texture to repeat mode glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); gluBuild2DMipmaps ( GL_TEXTURE_2D, GL_RGB, temp_tex -> sizeX, temp_tex -> sizeY, GL_RGB, GL_UNSIGNED_BYTE, temp_tex -> data ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); return textureId; } else { cout<<texName<<" can not be found"<<endl; return -1; } }
//Init
colors_texture = texManager.LoadTexture("1.bmp");
...
//Render
glActiveTextureARB (GL_TEXTURE1_ARB);
glBindTexture (GL_TEXTURE_2D, colors_texture);
*отрисовка треугольников
Voltt
> Плохая запись.
Ничем не плохая.
> Правильней: glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
Чем правильней?
NULL_PTR
> Чем правильней?
Тем, что GL_RGBA задаёт около 4к компонентов ^_^
Vel
Если простой имадж не подходить, то мипмапы точно работать не будут.
DimaO
Так, на всякий случай. Ты glTexImage2D не каждый кадр вызываешь?
Интересно. Сделал четырехкомпонентный массив, все отображается. Тогда почему не отображается трехкомпонентный?
Dimich
Пока только по одиночному событию. Когда разберусь с загрузкой, поменяю.
Тема в архиве.