|
Tutorial na vytváření 1D textury.
|
|
|
Pomocí 1D textury můžeme do objektu vložit více barev. Protože to je 1D textura, barvy
se definují jen pro jednu souřadnici. Následující procedura nám vytvoří 1D texturu která bude obsahovat
8 barev.
|
|
procedure GenRainbowTexture;
const
rainbow_image: array[1..8,1..3] of Byte = //použij 8 barev ve formátu RGB (3)
(
( $3f, $00, $3f ), //tmavě fialová
( $7f, $00, $7f ), //fialová
( $bf, $00, $bf ), //světle fialová
( $00, $00, $ff ), //modrá
( $00, $ff, $00 ), //zelená
( $ff, $ff, $00 ), //žlutá
( $ff, $7f, $00 ), //oranžová
( $ff, $00, $00 ) //červená
);
begin
RainbowTexture := glGenLists(1); //vytvoř List číslo 1
glNewList(RainbowTexture, GL_COMPILE); do kterého ulož texturu
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //lineárně rozlož (zmenši) texturu, pokud je textura větší než plocha objektu
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //lineárně rozlož (roztáhni) texturu do celého objektu, pokud je textura menší než plocha objektu
glTexImage1D(GL_TEXTURE_1D, 0, 3, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, @rainbow_image); //nastav 1D texturu
glEndList(); //konec Listu
end;
|
Můžeme použít více jak 8 barev, třeba 16, nebo 32. Stačí jen zvětšit pole konstanty rainbow_image: array[1..8,1..3] of Byte
z [1..8,1..3] na [1..16,1..3],nebo [1..32,1..3] a přidat hodnoty Red, Green, Blue pro každé pole.
Funkce glNewList(RainbowTexture = glGenLists(1), GL_COMPILE);
Nám vytvoří List, do kterého vložíme texturu. Tento List pak budeme volat
před vykreslováním objektů pomocí funkce glCallList(1);. Vše co se nachází mezi
glNewList(); a glEndList();se provede po volání funkce glCallList(1);
Do Listu se neukládají jen textury.
List může obsahovat třeba příkazy pro vykreslení nějakého objektu, nebo nějaký algoritmus.
Kažký List obsahuje své identifikační číslo.
Například glGenLists(1) vytvoří List s identifikačním číslem 1.
glCallList(1); nám pak tento List volá.
Hodnota GL_COMPILE nám určuje, že funkce, které jsou uvnitř Listu se provedou
až po volání funkce glCallList(1); Pokud bysme zadali hodnotu
GL_COMPILE_AND_EXECUTE, tak by se funkce volali ihned při vytváření Listu a potom
znovu při volání funkce glCallList(1);
Funkce glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); a
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); nám rozloží
texturu na plochu objektu. Jedna barva lineárně GL_LINEAR přechází do druhé. Pokud bysme zadali hodnotu
GL_NEAREST barvy by se zobrazili v pruzích s ostrými přechody.
glTexImage1D(GL_TEXTURE_1D, 0, 3, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, rainbow_image);
nastaví hodnoty 1D textury.
Hodnoty znamenají:
GL_TEXTURE_1D - specifikuje 1D texturu
0 - úroveň detailu při mipmapingu, v tomto případě zadáváme 0, protože mipmaping nepoužíváme.
Mipmapingu se budeme věnovat v některém z budoucích tutorialů.
3 - používej barvy RGB (Red Green Blue - hodnota 3),
nebo RGBA (Red, Green, Blue, Alfa - hodnota 4)
0 - šířka okraje textury
GL_RGB - používej barvy RGB
GL_UNSIGNED_BYTE - definice barev od 0 do 255
rainbow_image - textura
Naší proceduru GenRainbowTexture
voláme jen jednou při iniciaci OpenGL
|
|
procedure TForm1.InitWindow;
begin
SetPixelFormatDescriptor(Form1.Canvas.Handle); //nastav formát výstupního pixelu
RC := wglCreateContext(Form1.Canvas.Handle); //vytvoř RC (OpenGL Rendering Context)
//připoj RC (OpenGL Rendering Context) do DC (Windows Device Context), který komunikuje s wokenim GDI (Graphics Device Interface)
wglMakeCurrent(Form1.Canvas.Handle,RC);
glClearColor(0.0,0.0,0.0,0.0); //nastav černé pozadí scény
////sem budu zadávat funkce, které se mají provádět jen při startu aplikace////
GenRainbowTexture; //vygeneruj 1D texturu
////konec zadávání funkcí, které se mají provádět jen při startu aplikace////
wglMakeCurrent(0,0); //vynuluj RC (OpenGL Rendering Context)
end;
|
Nakonec zapneme texturování a zobrazíme otexturované objekty.
|
|
procedure DrawTriangles;
begin
glEnable(GL_TEXTURE_1D); //zapni 1D texturováni
glCallList(1); //načti texturu z Listu číslo 1 (RainbowTexture)
glPushMatrix; //začátek prostorové matice
glTranslatef(-1.5,0.0,-6.0); //pohni trojúhelníkem o 1.5 doleva o 6.0 od kamery
glBegin(GL_TRIANGLES); //začni vykreslovat trojúhelník
//první trojúhelník
glTexCoord2f(0,0); //texturová koordinace (levý horní bod textury)
glVertex3f( -1.0, 1.0, 0.0); //levý horní bod
glTexCoord2f(1,0); //texturová koordinace (pravý horní bod textury)
glVertex3f( 1.0, 1.0, 0.0); //pravý horní bod
glTexCoord2f(0,1); //texturová koordinace (levý dolní bod textury)
glVertex3f( -1.0, -1.0, 0.0); //levý dolní bod
//druhý trojúhelník
glTexCoord2f(1,1); //texturová koordinace (pravý dolní bod textury)
glVertex3f(1.0, -1.0, 0.0); //pravý dolní bod
glTexCoord2f(0,1); //texturova koordinace (levý dolní bod textury)
glVertex3f(-1.0, -1.0, 0.0); //levý dolní bod
glTexCoord2f(1,0); //texturová koordinace (pravý horní bod textury)
glVertex3f(1.0, 1.0, 0.0); //pravý horni bod
glEnd(); //ukonči vykreslování trojúhelníka
glPopMatrix; //konec prostorové matice
end;
|
Čtverec je tvořen ze dvou trojúhelníků. Textura se na trojúhelníky nalepí
podle hodnot, které zadáme do glTexCoord2f(x,y);. Texturovou koordinaci
glTexCoord2f(x,y); musíme zadávat pro každý bod trojúhelníka zvlášť.
Hodnoty funkce glTexCoord2f(x,y); jsou:
(0,0) - levý horní bod textury (souřadnice (x,y))
(1,1) - pravý dolní bod textury
Pokud zadáme místo 1 třeba 2, tak se textura na plochu objektu zobrazí dvakrát
(2,1) - vedle sebe
(1,2) - nad sebou
(2,2) - mozaika 2x2
Pokud zadáme hodnotu menší než 1, třeba 0.5 (0.5,1), tak na ploše objektu bude viditelná jen půlka textury
Dá se to vyjádřit pomocí procent.
1 = 100% -- zobrazí se celá textura
2 = 200% -- zobrazí se dvojnásobek textury
0.5 = 50% -- zobrazí se půlka textury
|
|
-->
Home