OpenGL v C++ Builderu 5



Duha

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

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ů.
void CalculateRainbow(void)
{
   int angle=0;    //úhel
   double x, y;    //body vrcholu
   double radius;    //poloměr
   int i=0;    //proměnná pro cyklus

   while (angle <= 180)    //pokud bude úhel menší nebo rovno 180 stupňů
   {
     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++;    //přičti 1
     radius++;    //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++;    //přičti 1
     angle = angle + 10;    //přičti úhel 10 stupňů
    }

}
Tato funkce 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.
void DrawRainbow(void)
{
    int i=0;    //proměnná pro cyklus
    glEnable(GL_TEXTURE_1D);    //zapni 1D texturování
    glCallList(1);    //načti texturu z Listu číslo 1  (RainbowTexture)
    glTranslatef( 0.0, -1.0, -8.0);    //pohni trojúhelníkem -1.0 dolu o 8.0 od kamery
    while(i < 35)    //opakuj, dokud nevykresliš 36 trojúhelníků
    {
        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);    //texturová 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

         //druhý trojúhelník
         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é
    }

}
Funkce CalculateRainbow() se volá jen jednou při startu aplikace.
bool __fastcall TForm1::InitGL()
{
    ...
    ...
      CalculateRainbow();    //vypočítej body pro vykreslení duhy
    ...
    ...
}
Funkce DrawRainbow() se volá v nekonečné smyčce.
void __fastcall TForm1::RenderGLScene()
{
    DrawRainbow();    //vykresli duhu
}

Stejný tutorial pro Delphi najdete zde


1D Textura 2D Textura




Home