2013-01-12 30 views
8

我正在学习如何在android上进行3D开发。我从一个简单的带有一些云的旋转星球开始。我花了两天时间试图让这个星球上的大气焕发。我在网上查找并尝试使用着色器,但无法实现。Android和行星着色

我的问题是,达到此目的的最佳方法是什么?我向正确的方向推动可能是我需要的一切。

我附上了迄今为止我所拥有的星球截图以及我正在拍摄的最终目标。

谢谢你的帮助。

最新研究进展:

enter image description here

最终目标: http://25.media.tumblr.com/tumblr_m06q7l7BpO1qk01v6o1_500.png

+0

如果你有顶点的法线,你可以使用它们。正常的z值越接近零,纹理颜色就会增加一些亮度。 – harism

回答

5

你需要什么?通常在后期处理完成渲染pass.So例如:

传递-1:渲染将行星模型转换为FBO纹理附件。 Pass-2:设置屏幕四边形,并将前一遍的纹理作为采样器统一。

然后在片段着色器中应用发光效果。 对于发光来说,有很多方法可以做到这一点。例如,您可以在第一遍中绘制行星的轮廓,给它发光的颜色填充,然后使用smoothstep()对其进行模糊处理,然后在后处理阶段你把它放在主星球纹理之下。 实际上here你可以看到很多关于如何为圆形对象发光的代码示例。

还有一件事。添加基于模糊的发光会极大地影响移动设备的性能。有一种称为“距离场”的技术。 Valve用它来反别名字体。但它也可以用来做辉光。你创建一个距离场纹理纹理复制一次你的星球轮廓,然后在后期处理中使用它来做光滑的发光效果。幸运的是,你有生成它的函数。 Here你可以找到论文和代码如何完成它。

+0

感谢您提供丰富的信息。我现在要做一些阅读。 – Leon

+0

“然后在后处理过程中,你把它放在主星球纹理之下”思想阐述了这一点?你的意思是你把质地放在这个星球后面吗? – async

1

看起来像你想要Rim Lighting。这不需要任何额外的通行证。

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

注意:示例中有很多额外的东西,但关键点是:将每个顶点的法线与相机视图向量的方向进行比较。当它们成直角时,(点积== 0)应用“全”光。当他们是parellel(点产品==长度)时,应用零光源。

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; 
}