[ pera89 @ 05.07.2007. 06:21 ] @
Pokusavam da ucitam BMP teksturu sa FreePascal-om. Prvo sam na BMP fajlu odstranio prvih 54 bajta jer su to informacije o dimenzijama slike itd.(koliko ja znam, ispravite me ako gresim). I onda sam zamenio mesta nekim bajtovima da bi format bio RGB a ne BGR kao u bmp formatu(Naravno napisao sam program koji ce to da uradi, nisam rucno menjao mesta). Ovaj izmenjen fajl sam nazvao 'test.tex'. Rezolucija teksture je 64x64.
Napisao sam prost program koji koristi OpenGL i treba da ucita ovu teksturu i da je mapira na jednom kvadratu, medjutim umesto teksture na kvadratu vidim samo belu boju. Evo koda i molim vas kazite mi u cemu sam pogresio:

{$mode objfpc}
program ogltest;
uses GL, GLU, GLUT;
var f:file;
data:pointer;
textureID:GLuint;
procedure DrawIt;
begin

glBegin(Gl_Quads);
glTexCoord2f(0,0);
glVertex2f(0,0);
glTexCoord2f(1,0);
glVertex2f(5,0);
glTexCoord2f(1,1);
glVertex2f(5,5);
glTexCoord2f(0,1);
glVertex2f(0,5);
glEnd;

end;

procedure DisplayWindow; cdecl;
begin
glClearColor(0, 0, 0.2, 1);
glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
DrawIt;
glutSwapBuffers;
end;

procedure OnTimer(value: Integer); cdecl;
begin
glutPostRedisplay;
glutTimerFunc(20, @OnTimer, 0);
end;

procedure keyb(xx1:byte;xx2,xx3:longint); cdecl;
begin
if xx1=27 then halt(0);
end;

begin
GetMem(data,12288); //64*64*3
assign(f,'test.tex');
reset(f,1);
BlockRead(f,data^,12288);
close(f);
glEnable(GL_TEXTURE_2D);
glGenTextures(1,@textureID);
glBindTexture(GL_Texture_2D, TextureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,3,64,64,1,GL_RGB,GL_UNSIGNED_BYTE,data);
glBindTexture(GL_Texture_2D, TextureID);

glutInit(@argc, argv);
glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
glutInitWindowSize(640,480);
glutCreateWindow('!!!');
glutDisplayFunc(@DisplayWindow);
glutKeyboardFunc(@keyb);
glutTimerFunc(20, @OnTimer, 0);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(90, 1.25, 5, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0, 0, -10);
glShadeModel(GL_SMOOTH);
glutMainLoop;
end.

P.S. Pocetnik sam u OpenGL programiranju, tako da ovaj kod mozda sadrzi pocetnicke greske.
[ bkaradzic @ 05.07.2007. 06:37 ] @
Moguće je da je stanje texture promenjeno u GLUT inicijalizaciji. Zato probaj da staviš:
Code:
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureID);

u DrawIt proceduru.
[ pera89 @ 05.07.2007. 10:01 ] @
Probao. Opet beli kvadrat. Hvala na pokusaju u svakom sucaju. Ako je nekom lakse da napise kod od pocetka nego da trazi gresku u mom, moze i tako, a ja cu da vidim gde sam zaj**ao stvar.
[ vlaiv @ 05.07.2007. 14:21 ] @
Nasumice pogledao ...

Mozda je problem u sledecem:

Ucitavas teksuru u memoriju gde si alocirao mesto - data ...

Gde tacno kazes openGL-u da treba da koristi te podatke?

Ah, sad sam video ...

Pogledaj da li ti glTexImage2D vraca gresku i ako vraca, koja je greska u pitanju ...

Jos jedna stvar koju bih preporucio:

Code:

glEnable(GL_TEXTURE_2D);
glGenTextures(1,@textureID);
glBindTexture(GL_Texture_2D, TextureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D,0,3,64,64,1,GL_RGB,GL_UNSIGNED_BYTE,data);
glBindTexture(GL_Texture_2D, TextureID);


stavi pre ulaska u main loop ... (posle inicijalizacije glut-a...)

Pokusaj svakako jos jednu stvar ... vidi da li su podaci u fajlu ispravni (mozda si zeznuo stvar sa programom za rgb -> bgr)

ako nije nista od toga onda mozda ovde lezi zec (mislim u ovom grmu ... :) )

Citat:

GL_RGB
Each element is an RGB triple. The GL converts it
to floating point and assembles it into an RGBA
element by attaching 1 for alpha. Each component
is then multiplied by the signed scale factor
GL_c_SCALE, added to the signed bias GL_c_BIAS,
and clamped to the range [0,1] (see
glPixelTransfer).



probaj da postavis GL_c_SCALE na recimo 1 ili mozda 0.9 i GL_c_BIAS na 0 ...
[ pera89 @ 05.07.2007. 18:21 ] @
Hvala Vlado, resio si mi problem. Ovaj deo koda je trebao da ide posle inicijalizacije glut-a, kao sto si rekao.