OpenGL v C++ Builderu 5



1D Textura

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

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í funkce nám vytvoří 1D texturu která bude obsahovat 8 barev.
void GenRainbowTexture(void)
{
  static unsigned char rainbow_image[8][3] =    //použij 8 barev ve formátu RGB (3)
  {
    { 0x3f, 0x00, 0x3f },    //tmavě fialová
    { 0x7f, 0x00, 0x7f },    //fialová
    { 0xbf, 0x00, 0xbf },    //modro fialová
    { 0x00, 0x00, 0xff },    //modrá
    { 0x00, 0xff, 0x00 },    //zelená 
    { 0xff, 0xff, 0x00 },    //žlutá
    { 0xff, 0x7f, 0x00 },    //oranžová
    { 0xff, 0x00, 0x00 }     //červená
  };

  glNewList(RainbowTexture = glGenLists(1), GL_COMPILE);    //vytvoř List číslo 1, 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
}
Můžeme použít více jak 8 barev, třeba 16, nebo 32. Stačí jen zvětšit pole konstanty rainbow_image[8][3] z [8] na [16],nebo [32] 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ší funkci GenRainbowTexture() voláme jen jednou při iniciaci OpenGL
bool __fastcall TForm1::InitGL()
{
  //připoj m_hRC (OpenGL Rendering Context) do m_hDC (Windows Device Context), který komunikuje s wokenim GDI (Graphics Device Interface)
  wglMakeCurrent(m_hDC, m_hRC);
  glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    //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(m_hDC, NULL);    //vynuluj m_hRC (OpenGL Rendering Context)
  return TRUE;
}
Nakonec zapneme texturování a zobrazíme otexturované objekty.
void DrawTriangles(void)
{
  glEnable(GL_TEXTURE_1D);    //zapni 1D texturováni
  glCallList(1);    //načti texturu z Listu číslo 1  (RainbowTexture)
    glTranslatef(-1.5f,0.0f,-6.0f);    //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
}
Č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 Delphi najdete zde


Barvy Duha




Home