2013-01-12 12 views
8

Sto imparando come sviluppare 3D su Android. Ho iniziato con un semplice pianeta rotante con alcune nuvole. Ho passato 2 giorni a cercare di ottenere un bagliore atmosferico aggiunto al pianeta. Ho cercato online e ho provato a lavorare con gli shader ma non sono riuscito ad andare lontano.Rendering Android and Planet

La mia domanda è, qual è il modo migliore per raggiungere questo obiettivo? Spingo nella giusta direzione potrebbe essere tutto ciò di cui ho bisogno.

Ho allegato uno screenshot del pianeta che ho finora, così come l'obiettivo finale per cui sto girando.

Grazie per qualsiasi aiuto.

progresso attuale:

enter image description here

Fine Obiettivo: http://25.media.tumblr.com/tumblr_m06q7l7BpO1qk01v6o1_500.png

+0

Se si dispone di normali per i vertici, è possibile utilizzarli. Il più vicino valore z normale arriva a zero aggiungendo un po 'di luminosità al colore della trama. – harism

risposta

5

Quello che vi serve di solito è fatto nel processo di post render pass.So ad esempio:

Passo -1: Render il modello del pianeta in allegato trama FBO. Pass- 2: imposta il quadrante dello schermo e collega la trama del passaggio precedente come uniforme del campionatore.

Quindi nello shader del frammento si applica un effetto bagliore. Per il bagliore, ci sono molti modi per farlo. Ad esempio puoi disegnare la sagoma del pianeta nel primo passaggio, dargli il colore di riempimento del tuo bagliore e poi sfumarlo usando smoothstep(). Poi nel passaggio post-processo lo metti sotto la trama del pianeta principale. In effetti here puoi vedere molti esempi di codice su come realizzare un bagliore per oggetti circolari.

Un'altra cosa. L'aggiunta del bagliore basato sulla sfocatura può influire notevolmente sulle prestazioni sul dispositivo mobile. Esiste una tecnica chiamata "Campo distanza". Valve usato per i font anti-alias. Ma può anche essere usato per fare glow. Si crea una copia texture del campo della trama a distanza della silhouette del pianeta una volta, quindi nella passata del post-processo si usa per ottenere un effetto bagliore liscio. Fortunatamente per ci sono funzioni per generarlo. Here puoi trovare i documenti e il codice su come farlo.

+0

Grazie per la ricchezza di informazioni. Farò un po 'di lettura ora. – Leon

+0

"Quindi nel passaggio del post-processo lo metti sotto la trama del pianeta principale" La mente sta elaborando questo? Vuoi dire che hai messo la trama dietro il pianeta? – async

1

Sembra che tu desideri l'illuminazione del bordo. Questo non richiede passaggi aggiuntivi.

c.f. http://oneclick-code.blogspot.co.uk/2012/01/ios-opengl-es-20-lighting-models-for.html

Nota: nell'esempio c'è un sacco di cose in più, ma il punto chiave è: si confronta la normale in ogni vertice con la direzione del vettore di visualizzazione della telecamera. Quando sono ad angolo retto, (prodotto punto == 0) si applica la luce "piena". Quando sono parellel (prodotto punto == lunghezza), applicare la luce zero.

varying mediump vec3 OUT_View; 
varying mediump vec3 OUT_Light; 
varying mediump vec3 OUT_Normal;          
varying mediump vec2 OUT_TexCoord; 
uniform sampler2D EXT_TEXTURE_01; 
uniform sampler2D EXT_TEXTURE_02; 
uniform sampler2D EXT_TEXTURE_03; 
uniform sampler2D EXT_TEXTURE_04; 

void main(void) 
{ 
    highp vec4 vDiffuseColor = vec4(0.0, 0.0, 0.5, 1.0); 
    highp float fDiffuseFactor = 0.2 + max (dot (OUT_Normal, OUT_Light), 0.0); 
    highp vec4 clr; 

    if (fDiffuseFactor < 0.3) 
     vDiffuseColor = vDiffuseColor * 0.1; 
    else 
    if (fDiffuseFactor < 0.7) 
     vDiffuseColor = vDiffuseColor * 0.5; 
    else 
    if (fDiffuseFactor < 0.8) 
     vDiffuseColor = vDiffuseColor; 
    else 
     vDiffuseColor = vDiffuseColor * 1.3; 

    gl_FragColor = vDiffuseColor; 
}