2010-08-18 3 views
11

Ho bisogno di tracciare una linea liscia in openGl ed ecco cosa ho fatto.Come tracciare una linea liscia con le antialias

glEnable(GL_LINE_SMOOTH); 
glEnable(GL_POLYGON_SMOOTH); 
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); 
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); 
glBegin(GL_LINE_STRIP); 
     for(UINT uiPoint = 0; uiPoint < iNumPoints; ++uiPoint) 
     { 
      const Coord &Node = vecPoints[uiPoint]; 
      glVertex3f(Node.x, Node.y, Node.z); 
     } 
glEnd(); 

Cos'altro posso fare?

risposta

11

È possibile generare invece poligoni sottili orientati sullo schermo e impostare l'alfa del frammento in base alla distanza dalla linea.

Esempio:

a (0,1)         b (0,1) 
    +--------------------------------------+ 
    A |          | B 
----+--------------------------------------+---- 
    |          | 
    +--------------------------------------+ 
    d (0,0)         c (0,0) 

si supponga di voler disegnare segmento [AB].

  • Draw poligono ABCD invece
  • mappa delle UV (il (0,0), (0,1))
  • legano un 8x1 texture in bianco e nero che è bianco solo sul centro
  • rendering con uno shader frammento impostato gl_FragColor.a dalla struttura

(più o meno la tecnica utilizzata in ShaderX5)

Ma fare solo se yo Non puoi usare MSAA.

+0

Ciao Calvin, Sono nuovo di OpenGL e non segue abbastanza i tuoi termini :). Sai dove posso trovare alcuni esempi che possono illustrare la tua idea? – q0987

+2

@ q0987: controlla questo: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter22.html – Stringer

+0

@Stringer Bell bel riferimento, non sapevo che fosse in gpugems2 anche – Calvin1602

5

GL_POLYGON_SMOOTH di per sé non va bene. È necessario forzare l'antialias quando viene creato il contesto OpenGL. Cosa usi per creare la finestra OpenGL? Verifica se supporta l'antialias tra i suoi parametri. Oppure potresti forzare l'antialiasing per tutti i programmi OpenGL con gli strumenti Nvidia o ATI ... Tutto dipende dalla tua configurazione.

+0

Ciao alxx, Sto utilizzando una piattaforma esistente che supporta il rendering OpenGL. – q0987

+3

Scusa, non dice niente. Quale libreria usa?Ci sono dei parametri per avviare OpenGL (come profondità del colore, presenza dello stencil, dimensione del buffer z e così via)? – alxx

20

È inoltre necessario attivare il blending affinché il livellamento della linea funzioni. Prova:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

e quindi tracciare linee. Può anche aiutare a impostare la larghezza della linea su una larghezza non integrale.

Come altri hanno già detto, questo non smusserà i bordi dei poligoni, ma creerà linee antialias.

+0

Fantastico, questo è esattamente quello che mi mancava. –

+0

Sto usando queste linee ma non funziona molto bene. Per favore vedi la mia domanda: http://stackoverflow.com/questions/30726077/page-curl-with-best-quality –

1

Non vi è alcuna garanzia che GL_LINE_SMOOTH o GL_POLYGON_SMOOTH facciano qualsiasi cosa.

+2

uh .. perché? dove posso trovare qualche riferimento a questo? – nkint

+2

sebbene sembrino funzionalità di base, la mia esperienza è che molti hardware non li implementano, quelli che non lo implementano in modo coerente e se lo implementano, il successo in termini di prestazioni può essere considerevole. se si guardano i documenti con le specifiche OpenGL, questi forniscono un eccellente riferimento per l'intera libreria, tuttavia non troverete alcuna menzione di questi elementi perché non fanno parte delle specifiche. Puoi confermarlo in qualche modo guardando le specifiche per glEnable: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glEnable.xml – jheriko

4

Come un'altra risposta menzionata, abilitare l'antialias aiuta - come abilitare ciò dipende dalla creazione del contesto, ma queste informazioni saranno probabilmente utili per gli utenti GLFW.

Se si utilizza GLFW 2: glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);

Se si utilizza GLFW 3: glfwWindowHint(GLFW_SAMPLES, 4);

... o qualunque numero di campioni di antialiasing si preferisce. I suggerimenti di cui sopra devono essere impostati prima di aprire la finestra GLFW.

0

Nanovg è un pacchetto di disegno 2D che esegue il rendering in OpenGL. L'ho usato insieme alla normale OpenGL per eseguire percorsi e linee 2D pieni e accarezzati. https://github.com/memononen/nanovg