8

我正在学习如何在 android 上进行 3D 开发。我从一个带有一些云的简单旋转行星开始。在过去的两天里,我一直在尝试为地球添加大气辉光。我在网上查看并尝试使用着色器,但无法走远。

我的问题是,实现这一目标的最佳方法是什么?我朝正确的方向轻推可能就是我所需要的。

我附上了一张我目前拥有的星球的截图,以及我为之奋斗的最终目标。

感谢您的任何帮助。

现在的进展:

在此处输入图像描述

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

4

2 回答 2

6

您需要的通常是在后期处理渲染过程中完成。例如:

Pass -1:将行星模型渲染为 FBO 纹理附件。Pass- 2:设置屏幕四边形,并将上一个通道的纹理附加为采样器均匀。

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

还有一件事。添加基于模糊的发光可以极大地影响移动设备的性能。有一种称为“距离场”的技术。Valve用它来抗锯齿字体。但它也可以用来做发光。您创建一次行星轮廓的距离场纹理纹理副本,然后在后期处理过程中使用它来做平滑发光效果。幸运的是你有生成它的功能。在这里你可以找到论文和如何完成它的代码。

于 2013-01-13T14:00:41.813 回答
2

看起来你想要边缘照明。这不需要任何额外的通行证。

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;
} 
于 2013-08-02T20:09:25.623 回答