2010-07-27 17 views
5

Ho un'applicazione opengl che carica un dxf e lo disegna sullo schermo, ogni volta che ho bisogno di calcolare le normali. c'è un modo per calcolare le normali in GPU invece di CPU? se é cosi, come ?posso calcolare le normali in gpu?

risposta

2

Sì, è possibile. Avrai bisogno di conoscere Shaders in Cg.

Official book.

+2

Le normali dovrebbero essere calcolate in geometry shader, non frammentare. – ext

1

Dai un'occhiata allo glEnable(GL_AUTO_NORMAL).

4

È possibile calcolare le normali "piatte ombreggiate" (una normale per facciata) all'interno dello shader della geometria. Uno per ogni triangolo, "al volo", usando i prodotti trasversali. Non è possibile generare normali "lisce" in questo modo, perché GS non ha informazioni sui vicini.

Se la mesh è parametrica (ad esempio, metaball), la normale può essere calcolata campionando alcuni valori di funzione vicini. Questo può essere fatto anche su GPU.

È anche possibile calcolare le normali in shader se la mesh è basata su heightmap o qualcosa di simile.

Se la GPU supporta CUDA, OpenCL o qualcosa di simile, E se può processare array arbitrari di dati, probabilmente si possono anche calcolare le normali sulla GPU, usando tecniche tradizionali.

Inoltre, penso che 5 anni fa (o giù di lì) ho visto un documento intitolato "normale livellamento su GPU" o "normale generazione su GPU". Sulla prima pagina aveva un cuore poligonale riflettente con ombreggiatura piatta. Sfortunatamente, non riesco a trovare quel documento, e non sono esattamente sicuro che esistesse (o dove l'ho visto). Potrebbe essere possibile trovarlo (se esiste) nei documenti GDC, nei documenti SIGGRAPH, ATI SDK o NVidia SDK.

4

Dovrai usare gli shader.

È possibile utilizzare uno shader di geometria GLSL. Ecco la versione GLSL per le normali del viso. I valori normali dei vortici richiedono più lavoro dal momento che devono prendere in considerazione i vertici vicini.

  • Assicurati che la tua scheda grafica supporti gli ombreggiatori geometrici! Utilizzare ad esempio GPU Caps Viewer.
  • Taglia e incolla qualsiasi esercitazione per incorporare uno shader di geometria nella tua app.
  • Lo shader dovrebbe essere simile a questo:
//glsl shader 

#version 120 
#extension GL_EXT_geometry_shader4 : enable 
void main(void) 
{ 
// Compute per-face normal 
    vec4 d1 = gl_PositionIn[1] - gl_PositionIn[0]; 
    vec4 d2 = gl_PositionIn[2] - gl_PositionIn[0]; 
    gl_Normal = cross(d1,d2); 

// Emit all input vertices 
    for(i=0; i< gl_VerticesIn; i++){ 
     gl_Position = gl_PositionIn[i]; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 
Problemi correlati