Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android and Planet Rendering

I am learning how to do 3D development on android. I started with a simple rotating planet with some clouds. I have spent past 2 days trying to get atmospheric glow added to the planet. I looked online and tried working with shaders but was unable to get far.

My question is, what is the best way to achieve this? I nudge in the right direction may be all I need.

I attached a screenshot of the planet I have so far, as well as the end goal I am shooting for.

Thank you for any help.

Current progress:

enter image description here

End Goal: http://25.media.tumblr.com/tumblr_m06q7l7BpO1qk01v6o1_500.png

like image 307
Leon Avatar asked Jan 12 '13 02:01

Leon


2 Answers

What you need is usually done in post process render pass.So for example :

Pass -1 : Render the planet model into FBO texture attachment. Pass- 2 :Set screen quad , and attach the texture from the previous pass as sampler uniform.

Then in the fragment shader apply a glow effect . For the glow, there are many ways of doing it.For example you can draw the silhouette of the planet in the first pass ,give it color fill of your glow and then bluring it using smoothstep().Then in post -process pass you put it under the main planet texture. In fact here you can see a lot of code samples on how to do a glow for circular objects.

One more thing.Adding blur based glow can impact the performance greatly on mobile device.There is a technique called "Distance Field".Valve used it to anti-alias fonts.But it also can be used to do glow.You create a distance field texture texture copy of your planet silhouette once ,then in the post - process pass use it to do smooth glow effect.Fortunately for you there are functions to generate it .Here you can find the papers and the code how to get it done.

like image 194
Michael IV Avatar answered Nov 18 '22 14:11

Michael IV


Looks like you want Rim Lighting. This does not require any additional passes.

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

Note: there's a lot of extra stuff in the example, but the key point is: you compare the normal at each vertex to the direction of your camera's view vector. When they are at right angles, (dot product == 0) apply "full" light. When they are parellel (dot product == length), apply zero light.

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;
} 
like image 2
Adam Avatar answered Nov 18 '22 14:11

Adam