OpenGL v Delphi 4



1D Textura

Příklad a zdroják ke stažení (210k)

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

Stejný tutorial pro C++ najdete zde


Barvy Duha


-->

Home