OpenGL v Delphi 4



Duha

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

Tutorial na vytváření duhy pomocí 1D textury.

Princip zobrazení 1D textury je stejný jako v předešlém tutorialu , akorát jsem si trochu hrál a přidal jsem výpočet oblouku, který se skládá z trojúhelníků.
procedure CalculateRainbow;
var
  angle: integer;    //úhel
  x, y: double;    //body vrcholu
  radius: double;    //poloměr
  i: integer;    //proměnná pro cyklus
begin
   angle := 0;    //nastav úhel na 0
   i := 0;    //nastav i na 0

   while angle <= 180 do    //pokud bude úhel menší nebo rovno 180 stupňů
   begin
     radius := 3;    //nastav poloměr na 3
     x := radius * sin(RadToGrad(angle-90));    //vypočti pozici bodu x
     y := radius * sin(RadToGrad(angle));    //vypočti pozici bodu y
     RainbowVertex[i].x := x;    //bod x přiřaď bodu x jednoho z vnitřních vrcholů
     RainbowVertex[i].y := y;    //bod y přiřaď bodu y jednoho z vnitřních vrcholů

     i := i + 1;    //přičti 1
     radius := radius + 1;    //přičti poloměr 1
     x := radius * sin(RadToGrad(angle-90));    //vypočti pozici bodu x
     y := radius * sin(RadToGrad(angle));    //vypočti pozici bodu y
     RainbowVertex[i].x := x;    //bod x přiřaď bodu x jednoho z vnějších vrcholů
     RainbowVertex[i].y := y;    //bod y přiřaď bodu y jednoho z vnějších vrcholů

     i := i + 1;    //přičti 1
     angle := angle + 10;    //přičti úhel 10 stupňů
   end;

end;
Tato procedura vypočítá pozici RainbowVertex[i].x a RainbowVertex[i].y všech bodů oblouku. Pozice bodu z je 0.



Pomocí těchto bodů pak vykreslíme trojúhelníky, otexturované 1D texturou.
procedure DrawRainbow;
var
  i: integer;    //proměnná pro cyklus
begin
    i := 0;    //nastav i na 0

    glEnable(GL_TEXTURE_1D);    //zapni 1D texturování
    glCallList(1);    //načti texturu z Listu číslo 1  (RainbowTexture)

    glPushMatrix;    //začátek prostorové matice
    glTranslatef( 0.0, -1.0, -8.0);    //pohni trojúhelníkem -1.0 dolu o 8.0 od kamery
    while(i < 35) do    //opakuj, dokud nevykresliš 36 trojúhelníků
    begin
      glBegin(GL_TRIANGLES);    //začni vykreslovat trojúhelník
        //první trojúhelník
        glTexCoord2f(0,0);    //texturová koordinace (levý horní vrchol textury)
        glVertex3f( RainbowVertex[i].x, RainbowVertex[i].y, 0.0);    //levý dolní vrchol
        glTexCoord2f(1,0);    //texturova koordinace (pravý horní vrchol textury)
        glVertex3f( RainbowVertex[i+1].x, RainbowVertex[i+1].y, 0.0);    //levý horní vrchol
        glTexCoord2f(0,1);    //texturova koordinace  (levý dolní vrchol textury)
        glVertex3f( RainbowVertex[i+2].x, RainbowVertex[i+2].y, 0.0);    //pravý dolní vrchol

        //druhy trojuhelnik
        glTexCoord2f(1,1);    //texturová koordinace (pravý dolní vrchol textury)
        glVertex3f( RainbowVertex[i+3].x, RainbowVertex[i+3].y, 0.0);    //pravý horní vrchol
        glTexCoord2f(0,1);    //texturova koordinace (levý dolní vrchol textury)
        glVertex3f( RainbowVertex[i+2].x, RainbowVertex[i+2].y, 0.0);    //pravý dolní vrchol
        glTexCoord2f(1,0);    //texturova koordinace  (pravý horní vrchol textury)
        glVertex3f( RainbowVertex[i+1].x, RainbowVertex[i+1].y, 0.0);    //levý horní vrchol
      glEnd();  //ukonči vykreslování trojúhelníka

      i := i + 2;    //přičti dvojku aby se další trojúhelníky nekreslili přes předešlé
    end;
    glPopMatrix;    //konec prostorové matice
end;
Procedura CalculateRainbow se volá jen jednou při startu aplikace.
procedure TForm1.InitWindow;
begin
   ...
   ...
      CalculateRainbow;    //vypočítej body pro vykreslení duhy
   ...
   ...
end;
Procedura DrawRainbow se volá v nekonečné smyčce.
procedure TForm1.RenderGLScene;
begin
   DrawRainbow;    //vykresli duhu
end;

Stejný tutorial pro C++ najdete zde


1D Textura 2D Textura




Home