すべてのソースコードは PatchyFog.java にあります。以下は getMaterialSpec() メソッドです。
public void getMaterialSpec(MaterialSpec spec, double x, double y, double z, double xsize, double ysize, double zsize, double t) { double size = 1.0, scale = 1.0; float d = 0.0f; for (int i = 0; i < 3 && xsize < size && ysize < size && zsize < size; i++) { d += (float) (size*Noise.value(x*scale+123.456, y*scale+123.456, z*scale+123.456)); size *= 0.5; scale *= 2.0; } d = 0.5f*d + 1.0f - thickness; if (d > 1.0f) d = 1.0f; else if (d < 0.0f) d = 0.0f; spec.transparency.setRGB(d, d, d); spec.color.copy(color); if (scattering > 0.0f) { d = scattering*(1.0f-d); spec.scattering.setRGB(d, d, d); spec.eccentricity = 0.0; } }このメソッドについて重要な注意点がいくつもあります。
d = 0.5f*d + 1.0f - thickness;は少し不定な感じです。範囲 [0, 1] の濃さの値で、便利な材質の範囲を、とても薄い状態からほぼ完全に不透明まで含ませたいところです。そしてこの関数は経験的に、良い結果をもたらすことが知られています。
public boolean isScattering() { return (scattering > 0.0f); }scattering = 0 のときは isScattering は「偽」(false) を返し、レンダラーは散乱色を無視します。