Trojúhelníkový proužek - Triangle strip

Schéma čtyř trojúhelníků, 1, 2, 3 a 4, s vrcholy A, B, C, D, E a F.

Trojúhelník pás je řada připojených trojúhelníků z trojúhelníkové sítě , které sdílejí vrcholy , které umožní efektivnější využití paměti pro počítačové grafiky . Jsou efektivnější než seznamy trojúhelníků bez indexování, ale obvykle jsou stejně rychlé nebo pomalejší než seznamy indexovaných trojúhelníků. Hlavním důvodem použití trojúhelníkových proužků je snížení množství dat potřebných k vytvoření řady trojúhelníků. Počet vrcholů uložených v paměti se sníží z 3N na N+2 , kde N je počet nakreslených trojúhelníků. To umožňuje menší využití místa na disku a také jejich rychlejší načítání do RAM .

Například čtyři trojúhelníky v diagramu bez použití trojúhelníkových proužků by musely být uloženy a interpretovány jako čtyři samostatné trojúhelníky: ABC, CBD, CDE a EDF. Pomocí trojúhelníkového pásu je však lze jednoduše uložit jako posloupnost vrcholů ABCDEF. Tato sekvence by byla dekódována jako sada trojúhelníků s vrcholy na ABC, BCD, CDE a DEF-ačkoli přesné pořadí, ve kterém se čtou vrcholy, nebude v pořadí zleva doprava, protože by to mělo za následek sousední trojúhelníky obrácené ke střídavým směrům .

Implementace OpenGL

Model dvou trojúhelníků nakreslených v OpenGL pomocí trojúhelníkových proužků.

OpenGL má vestavěnou podporu pro trojúhelníkové pásy. Opravená funkce OpenGL (zastaralé v OpenGL 3.0) má podporu pro trojúhelníkové pásy využívající okamžitý režim a funkce glBegin () , glVertex*() a glEnd () . Novější verze podporují trojúhelníkové pásy pomocí glDrawElements a glDrawArrays .

Aby bylo možné nakreslit trojúhelníkový pás pomocí okamžitého režimu OpenGL, musí být předán argument glBegin () argumentu GL_TRIANGLE_STRIP , který upozorní OpenGL na vykreslení trojúhelníkového pásu. Rodina funkcí glVertex*() určuje souřadnice pro každý vrchol v pásu trojúhelníků. Další informace najdete v Redbooku OpenGL.

Chcete -li nakreslit trojúhelníkový proužek v diagramu pomocí okamžitého režimu OpenGL, kód je následující:

 //Vertices below are in Clockwise orientation
 //Default setting for glFrontFace is Counter-clockwise
 glFrontFace(GL_CW);

 glBegin(GL_TRIANGLE_STRIP);	
 glVertex3f( 0.0f, 1.0f, 0.0f ); //vertex 1
 glVertex3f( 0.0f, 0.0f, 0.0f ); //vertex 2
 glVertex3f( 1.0f, 1.0f, 0.0f ); //vertex 3
 glVertex3f( 1.5f, 0.0f, 0.0f ); //vertex 4
 glEnd();

Všimněte si, že k nakreslení druhého trojúhelníku je potřeba pouze jeden další vrchol. V OpenGL je důležité pořadí, ve kterém jsou vrcholy specifikovány, aby normály povrchu byly konzistentní.

Citace přímo z OpenGL Programming Guide :

GL_TRIANGLE_STRIP

Pruh trojúhelníků v OpenGL.svg

Nakreslí řadu trojúhelníků (třístranné mnohoúhelníky) pomocí vrcholů v0, v1, v2, pak v2, v1, v3 (poznamenejte si pořadí), pak v2, v3, v4 atd. Pořadí je zajistit, aby všechny trojúhelníky byly nakresleny se stejnou orientací, aby pás mohl správně tvořit část povrchu.

Na stránkách manuálu je to ještě jasnější:

Nakreslí spojenou skupinu trojúhelníků. Pro každý vrchol uvedený za prvními dvěma vrcholy je definován jeden trojúhelník. Pro liché n definují vrcholy n, n+1 a n+2 trojúhelník n. Pro sudé n definují vrcholy n+1, n a n+2 trojúhelník n. Nakreslí se trojúhelníky N-2.

Výše uvedený ukázkový kód a diagram ukazují trojúhelníky nakreslené ve směru hodinových ručiček. Aby byly považovány za orientované zepředu, je nutné předchozí volání glFrontFace (GL_CW) , které má jinak počáteční hodnotu GL_CCW (což znamená, že trojúhelníky nakreslené proti směru hodinových ručiček jsou ve výchozím nastavení otočeny čelem). To je významné, pokud glEnable (GL_CULL_FACE) a glCullFace (GL_BACK) jsou již aktivní ( GL_BACK ve výchozím nastavení), protože trojúhelníky směřující dozadu budou vyřazeny, takže nebudou vykresleny a vůbec se nezobrazí na obrazovce.

Vlastnosti a konstrukce

Z definice vyplývá, že podsekvence vrcholů trojúhelníkového pásu také představuje trojúhelníkový pás. Pokud však tento dílčí pás začíná na sudém (s počítáním na základě 1) vrcholu, pak výsledné trojúhelníky změní svou orientaci. Například podskupina BCDEF by představovala trojúhelníky: BCD, CED, DEF.

Podobně, obrácení vrcholů pásů bude mít za následek stejnou sadu trojúhelníků, pokud má pás sudý počet vrcholů. (např. proužek FEDCBA bude představovat stejné trojúhelníky FED, ECD, DCB, CAB jako původní proužek). Pokud má však pás lichý počet vrcholů, pak obrácený pruh bude představovat trojúhelníky s opačnou orientací. Například obrácení proužku ABCDE bude mít za následek proužek EDCBA, který představuje trojúhelníky EDC, DBC, CBA).

Přeměna obecné polygonové sítě na jeden dlouhý pruh nebyla donedávna obecně možná. Trojúhelníkové pásy jsou obvykle analogické sadě okrajových smyček a póly na modelu jsou reprezentovány trojúhelníkovými ventilátory . Nástroje jako Stripe nebo FTSG představují model jako několik proužků. Optimální seskupení sady trojúhelníků do sekvenčních pásů bylo prokázáno jako NP-Complete .

Alternativně lze kompletní objekt popsat jako degenerovaný proužek , který obsahuje trojúhelníky nulové oblasti, které software pro zpracování nebo hardware vyřadí. Tyto degenerované trojúhelníky účinně zavést nespojitosti nebo „přeskočí“ na pásu. Síť v diagramu může být například také reprezentována jako ABCDDFFEDC, což by bylo interpretováno jako trojúhelníky ABC CBD CDD DDF DFF FFE FED DEC (degenerované trojúhelníky označené kurzívou). Všimněte si, jak tento pruh nejprve vytvoří dva trojúhelníky zleva, pak se restartuje a zbývající dva vytvoří zprava.

I když nespojitosti v pásech trojúhelníků lze vždy implementovat opětovným odesláním vrcholů, rozhraní API někdy tuto funkci výslovně podporují. IRIS GL podporuje Swapy (převrácení dvou následujících vrcholů v pásu), což je funkce, na kterou se spoléhají rané algoritmy, jako je algoritmus SGI . V poslední době může OpenGL/DirectX vykreslit více pásů trojúhelníků bez degenerovaných trojúhelníků pomocí funkce Primitive Restart.

Trasování křivky pomocí trojúhelníkového proužku

Reference

Viz také