2013-08-01 14 views
5

Sto cercando di chiarire alcune incongruenze che sto vedendo nella direzione di avvolgimento dei vertici della striscia triangolare (in senso orario e antiorario). Sto disegnando un trapezoide ruotato di 90 gradi in senso antiorario in OpenGL. Ecco il codice rilevante:La direzione di avvolgimento in una striscia triangolare OpenGL si alterna da triangolo a triangolo?

unsigned char mIndices[] = { 0, 1, 2, 3, 4, 5 }; 
signed short mVertices[] = { 
           -50, 100, 0, // A 
           -85, 65, 0,  // B 
           -50, 65, 0,  // C 
           -85, -65, 0, // D 
           -50, -65, 0, // E 
           -50, -100, 0, // F 
}; 

... 

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_SHORT, 0, mVertices); 

... 

glDrawElements(GL_TRIANGLE_STRIP, sizeof(mVertices)/sizeof(mVertices[0]), GL_UNSIGNED_BYTE, mIndices); 

Da quello che ho letto here, la faccia anteriore di default in OpenGL è in senso antiorario, il che significa che il primo triangolo nella mia striscia deve avere è vertici ordinato in senso antiorario. Inoltre, quando si disegna una striscia triangolare, l'avvolgimento cambia direzione in senso antiorario e orario da triangolo a triangolo, quindi i miei vertici sono ordinati in quel modo. Quindi dal mio codice, il primo triangolo sarebbe ABC, il secondo sarebbe BCD, terzo CDE e quarto DEF. Tuttavia, l'articolo this (nella citazione dalla Guida alla programmazione OpenGL) dice che li traccerebbe come ABC, CBD, CDE, EDF (supponendo v0 - A, v1 - B, ecc.), Il che significa che tutti si avvolgono nella stessa direzione in senso antiorario direzione.

Se io sto capendo la notazione A/B correttamente dalla specifica OpenGL, i triangoli sarebbero tutti nella stessa direzione del vento, ma ho visto la variabile di avvolgimento in pochi luoghi diversi. Suppongo che sia solo un problema di semantica dal momento che la forma risultante è la stessa, ma qual è l'ordine di avvolgimento effettivo?

risposta

7

Quindi, dal mio codice, il primo triangolo sarebbe ABC, la seconda sarebbe in BCD terzo CDE, e quarto DEF. Tuttavia, questo articolo (nella citazione dalla Guida alla programmazione OpenGL) dice che li traccerebbe come ABC, CBD, CDE, EDF (supponendo v0 - A, v1 - B, ecc.), Il che significa che tutti si avvolgono nella stessa direzione in senso antiorario direzione.

Ciò che entrambi hanno detto è vero. Da un certo punto di vista;)

Il tutorial che hai citato ne sta parlando dal punto di vista dell'ordine in cui i vertici sono fornito al rasterizer. Quale è esattamente come dichiarato. Il rasterizzatore vede un singolo flusso di ABCDEF ... vertici. Pertanto, da quella prospettiva, il rasterizzatore deve passare il suo ordine di avvolgimento interno su ogni altro triangolo al fine di corrispondere allo scopo dell'utente.

Il libro che hai citato ne sta parlando dal punto di vista di come tu pensi all'ordine di quei triangoli. Mentre li fornisci in questo ordine, vuoi che l'avvolgimento funzioni come ABC, CBD, CDE, ecc. E per ottenere ciò, li fornisci nell'ordine ABCDEF ....

4

Ti assicuriamo che i triangoli risultanti da una striscia triangolare sono tutti avvolti nello stesso ordine (altrimenti sarebbe un disordine totale e non potresti usare le cose semplici come il back-face culling o il rendering a due lati) , fa parte della magia di una striscia triangolare e il motivo per cui disegnare un semplice triangolo partendo da ciascun vertice consecutivo non funzionerebbe (beh, lo sarebbe, ma risulterebbe in ordini di avvolgimento alternati, che non è mai (mai) un buono idea). Quindi il secondo articolo (dalla guida alla programmazione OpenGL) è corretto e il primo articolo è sbagliato, la sua semantica è incasinata o è stata erroneamente interpretata da te (anche se immagino quest'ultima, data la qualità di quel tutorial, ma forse Nicol Bolas stesso può far luce su di esso).

EDIT: Ok, guardando alla fine del primo articolo:

Notate come si alterna in senso orario e antiorario. Questo significa che, indipendentemente da quale faccia tu consideri frontale, e quale faccia abbi, perderai sempre circa la metà dei volti.

Tuttavia, OpenGL è piuttosto intelligente su questo. Le strisce triangolari fanno il confronto facciale in modo diverso. Per ogni secondo triangolo, quello che è l'ordine di avvolgimento è opposto rispetto all'ordine del primo triangolo, l'ordine di avvolgimento è considerato arretrato ai fini del culling.

Quindi, se è stata impostata la faccia anteriore di essere in senso orario, e hanno il viso abbattimento abbattimento di back-fronte triangoli, tutto funzionerà esattamente come si aspetta fino a quando l'ordine del primo triangolo è corretto. Ogni triangolo numerato pari verrà abbattuto se ha un avvolgimento in senso orario e ogni triangolo dispari verrà abbattuto se ha un avvolgimento in senso antiorario .

In realtà dice che mentre l'ordine avvolgimento sarebbe teoricamente alternerà, rappresenta OpenGL per questo e "fissa" it per strisce di triangoli, con conseguente nell'ordine avvolgimento praticamente (per tutte le considerazioni che affrontano, come abbattimento o il frammento gl_FrontFacing variabile shader) è la stessa per ogni triangolo. Quindi entrambi gli articoli sono corretti e semplicemente non hai letto il primo fino alla fine. Anche se l'articolo avrebbe potuto rendere più chiaro che non è solo fatto per scopi di abbattimento, ma per tutti gli scopi e quindi praticamente invisibile per te.