Disegna il contorno attorno all'oggetto in Opengl


8

Devo disegnare un contorno attorno a oggetti 2D nello spazio 3d. Ho provato a disegnare linee attorno all'oggetto (+ punti per riempire lo spazio), ma a causa della larghezza della linea, una parte di esso (~ 50%) copriva l'oggetto. Ho provato a usare il buffer di stencil, per eliminare questo problema, ma ho ottenuto sth in questo modo (il contorno è verde):

http://goo.gl/OI5uc (mi dispiace non poter pubblicare immagini, a causa della mia reputazione)

Puoi vedere (dove punta la freccia), che alcune parti della linea sono dietro all'oggetto e altre sopra. Questo cambia quando sposto la fotocamera, ma c'è sempre una parte che la copre. Ecco il codice che uso per disegnare l'oggetto:

    glColorMask(1,1,1,1);
    std::list<CObjectOnScene*>::iterator objIter=ptr->objects.begin(),objEnd=ptr->objects.end();
    int countStencilBit=1;
    while(objIter!=objEnd)
    {
        glColorMask(1,1,1,1);
        glStencilFunc(GL_ALWAYS,countStencilBit,countStencilBit);
        glStencilOp(GL_REPLACE,GL_KEEP,GL_REPLACE );
        (*objIter)->DrawYourVertices();

        glStencilFunc(GL_NOTEQUAL,countStencilBit,countStencilBit);
        glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE);
        (*objIter)->DrawYourBorder();

        ++objIter;
        ++countStencilBit;
    }

Ho provato diverse impostazioni del buffer dello stencil, ma sempre mi sono procurato questo. Ecco la domanda: 1. Sto impostando il buffer dello stencil sbagliato?

2. Esistono altri modi semplici per creare contorni su tali oggetti?

Grazie in anticipo.

MODIFICARE:

1. Non ho normali di oggetti.

2. L' oggetto può essere concavo.

3. Non riesco ad usare gli shader (vedi sotto perché).


Puoi dare un'occhiata a 'toon' o all'ombreggiatura delle celle, dove c'è un contorno disegnato attorno a un oggetto. lighthouse3d.com/tutorials/glsl-tutorial/?toon .
Jonathan Connell,

Il caso è che non posso usare shader in questo progetto ...
therealszaka,

@Maciekp Perché non puoi usare gli shader? Sono compiti a casa?
Jonathan Connell,

Questa app dovrà funzionare su molti computer, non sempre il più recente (ovvero 1 punto) .2. Non è un gioco, questa è un'app con grafica come parte di essa + dovrà funzionare su Mac, Win, Linux.
therealszaka,

1
Potrebbe essere stato pubblicato su SO se non fosse per GameDev e dovresti fornire il maggior numero di informazioni possibile se desideri che la tua domanda abbia una risposta.
Jonathan Connell,

Risposte:


12
  • Disegna l'intera scena, tranne gli oggetti evidenziati.
  • Disegna gli oggetti che desideri evidenziare, con colori puri, ordinati da dietro a davanti e con una piccola scala applicata (1.05f - 1.1f).
  • Disegna gli oggetti finali, di nuovo, da dietro a davanti.

Per un tocco in più, prova a disegnare il passaggio del contorno su un target di rendering separato e applica una piccola sfocatura, quindi fondi questa trama con la scena finale usando i valori Z appropriati.


Questo è un grande trucco Barba!
FxIII,

Questo è il vecchio trucco che hanno usato per i contorni quando la pipeline gfx era ancora fissa.
Jonathan Connell,

2
Ciò non funzionerà per gli oggetti concavi
therealszaka,

@Maciekp La tua domanda riguardava oggetti 2D (piani) nello spazio 3D, da dove viene il concavo? Basta ridimensionare lungo i due assi! = In direzione della faccia.
Jonathan Connell,

Si dovrebbe lavorare per gli oggetti concavi Se si inverte il normali (è necessario disporre di face culling abilitato) mentre si disegna i contorni.
r2d2rigo,

0

Lo farò così:

  • Ordinare gli oggetti nell'ordine fronte-retro (distanza dalla telecamera)

  • Disegna il bordo dell'oggetto (come linee e punti) con disabilitato GL_DEPTH_TEST

  • Disegna l'oggetto con abilitato GL_DEPTH_TEST

  • Esegui gli ultimi due passaggi per ogni oggetto

Proverò a farlo in questo modo, ma se qualcuno ha idee per una soluzione migliore a questo problema (MIND CONCAVE OBJECTS, PER FAVORE) - sentiti libero di condividere con noi.

PS. Non sono pienamente soddisfatto dei miei stati OpenGL che cambiano soluzione, quindi spesso possono essere dannosi. Ma se nessuno mi può aiutare con le impostazioni del buffer dello stencil, immagino che sia l'unico modo per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.