我正在学习如何在 android 上进行 3D 开发。我从一个带有一些云的简单旋转行星开始。在过去的两天里,我一直在尝试为地球添加大气辉光。我在网上查看并尝试使用着色器,但无法走远。
我的问题是,实现这一目标的最佳方法是什么?我朝正确的方向轻推可能就是我所需要的。
我附上了一张我目前拥有的星球的截图,以及我为之奋斗的最终目标。
感谢您的任何帮助。
现在的进展:

最终目标:http: //25.media.tumblr.com/tumblr_m06q7l7BpO1qk01v6o1_500.png
我正在学习如何在 android 上进行 3D 开发。我从一个带有一些云的简单旋转行星开始。在过去的两天里,我一直在尝试为地球添加大气辉光。我在网上查看并尝试使用着色器,但无法走远。
我的问题是,实现这一目标的最佳方法是什么?我朝正确的方向轻推可能就是我所需要的。
我附上了一张我目前拥有的星球的截图,以及我为之奋斗的最终目标。
感谢您的任何帮助。
现在的进展:

最终目标:http: //25.media.tumblr.com/tumblr_m06q7l7BpO1qk01v6o1_500.png
您需要的通常是在后期处理渲染过程中完成。例如:
Pass -1:将行星模型渲染为 FBO 纹理附件。Pass- 2:设置屏幕四边形,并将上一个通道的纹理附加为采样器均匀。
然后在片段着色器中应用发光效果。对于发光,有很多方法可以做到。例如,您可以在第一遍中绘制行星的轮廓,给它填充颜色,然后使用 smoothstep() 将其模糊。然后在后期处理中传递给您把它放在主行星纹理下。事实上,在这里你可以看到很多关于如何为圆形物体发光的代码示例。
还有一件事。添加基于模糊的发光可以极大地影响移动设备的性能。有一种称为“距离场”的技术。Valve用它来抗锯齿字体。但它也可以用来做发光。您创建一次行星轮廓的距离场纹理纹理副本,然后在后期处理过程中使用它来做平滑发光效果。幸运的是你有生成它的功能。在这里你可以找到论文和如何完成它的代码。
看起来你想要边缘照明。这不需要任何额外的通行证。
cf http://oneclick-code.blogspot.co.uk/2012/01/ios-opengl-es-20-lighting-models-for.html
注意:示例中有很多额外的东西,但关键是:您将每个顶点的法线与相机的视图向量的方向进行比较。当它们成直角时,(点积 == 0)应用“全”光。当它们平行时(点积 == 长度),应用零光。
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;
}