|
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public class PlanetInit : MonoBehaviour
|
|
{
|
|
public GameObject m_sun;
|
|
public Material m_groundMaterial;
|
|
public Material m_skyMaterial;
|
|
|
|
public float m_hdrExposure = 0.8f;
|
|
public Vector3 m_waveLength = new Vector3(0.65f,0.57f,0.475f); // Wave length of sun light
|
|
public float m_ESun = 20.0f; // Sun brightness constant
|
|
public float m_kr = 0.0025f; // Rayleigh scattering constant
|
|
public float m_km = 0.0010f; // Mie scattering constant
|
|
public float m_g = -0.990f; // The Mie phase asymmetry factor, must be between 0.999 to -0.999
|
|
|
|
//Dont change these
|
|
private const float m_outerScaleFactor = 1.025f; // Difference between inner and ounter radius. Must be 2.5%
|
|
private float m_innerRadius; // Radius of the ground sphere
|
|
private float m_outerRadius; // Radius of the sky sphere
|
|
private float m_scaleDepth = 0.25f; // The scale depth (i.e. the altitude at which the atmosphere's average density is found)
|
|
|
|
void Start ()
|
|
{
|
|
//Get the radius of the sphere. This presumes that the sphere mesh is a unit sphere (radius of 1)
|
|
//that has been scaled uniformly on the x, y and z axis
|
|
float radius = transform.lossyScale.x;
|
|
|
|
m_innerRadius = radius;
|
|
//The outer sphere must be 2.5% larger that the inner sphere
|
|
m_outerRadius = m_outerScaleFactor * radius;
|
|
|
|
InitMaterial(m_groundMaterial);
|
|
InitMaterial(m_skyMaterial);
|
|
}
|
|
|
|
void Update ()
|
|
{
|
|
InitMaterial(m_groundMaterial);
|
|
InitMaterial(m_skyMaterial);
|
|
}
|
|
|
|
void InitMaterial(Material mat)
|
|
{
|
|
Vector3 invWaveLength4 = new Vector3(1.0f / Mathf.Pow(m_waveLength.x, 4.0f), 1.0f / Mathf.Pow(m_waveLength.y, 4.0f), 1.0f / Mathf.Pow(m_waveLength.z, 4.0f));
|
|
float scale = 1.0f / (m_outerRadius - m_innerRadius);
|
|
|
|
mat.SetVector("v3LightPos", m_sun.transform.forward*-1.0f);
|
|
mat.SetVector("v3InvWavelength", invWaveLength4);
|
|
mat.SetFloat("fOuterRadius", m_outerRadius);
|
|
mat.SetFloat("fOuterRadius2", m_outerRadius*m_outerRadius);
|
|
mat.SetFloat("fInnerRadius", m_innerRadius);
|
|
mat.SetFloat("fInnerRadius2", m_innerRadius*m_innerRadius);
|
|
mat.SetFloat("fKrESun", m_kr*m_ESun);
|
|
mat.SetFloat("fKmESun", m_km*m_ESun);
|
|
mat.SetFloat("fKr4PI", m_kr*4.0f*Mathf.PI);
|
|
mat.SetFloat("fKm4PI", m_km*4.0f*Mathf.PI);
|
|
mat.SetFloat("fScale", scale);
|
|
mat.SetFloat("fScaleDepth", m_scaleDepth);
|
|
mat.SetFloat("fScaleOverScaleDepth", scale/m_scaleDepth);
|
|
mat.SetFloat("fHdrExposure", m_hdrExposure);
|
|
mat.SetFloat("g", m_g);
|
|
mat.SetFloat("g2", m_g*m_g);
|
|
mat.SetVector("v3LightPos", m_sun.transform.forward*-1.0f);
|
|
mat.SetVector("v3Translate", transform.position);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|