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