|
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;
Home