Em resumo..
Eu estaria pensando isso através da ciência.
Como todos sabemos, a neve é chuva e vice-versa, exceto que eles têm estados sólidos diferentes devido a mudanças de temperatura.
As mudanças de temperatura podem ser associadas aos ventos.
Um rápido Google para "o que causa o vento" me deu uma resposta do Answers.com:
"A força do gradiente de pressão, que surge do aquecimento desigual da superfície da Terra. Uma vez em movimento, a força de Coriolis surge da rotação da Terra para desviá-la (à direita no hemisfério norte, à esquerda no hemisfério sul)".
Sim, não é a melhor fonte para questões científicas, mas dá a ideia.
Então, teoricamente, você só precisa de vento agora. Pode ser aleatório ou, de alguma forma, pode ser de alguma forma programado para o seu ambiente, que é aquecido devido a alguns eventos.
Aprecie o vento agora, aplique na sua posição atual e, aleatoriamente ou através de um script, faça nuvens dela. Quanto mais densa a nuvem, maior a probabilidade e a densidade da chuva. Se a temperatura estiver baixa o suficiente, a chuva se tornará neve. Mova a nuvem e torne-a "não tão densa" com esse vento.
Quanto à tela, depende de você, apenas armazene em cache os estados das partículas que caem if rain -> use water drop texture
e if snow -> use snowflake texture
. Use o vento para fazer essas partículas se moverem de acordo com a direção do vento (sim, você deve armazenar esta também em algum lugar) para torná-la um pouco mais realista.
E com isso você pode expandir tudo. Por exemplo, se houver neve caindo e os flocos de neve caírem perto de algum tipo de fonte de calor, altere a textura das partículas para chover novamente.
Muitas possibilidades, na verdade, este é apenas um conceito simples.
PS Quanto ao granizo, veja o que os torna, expanda o conceito para esse ambiente.
Divirta-se, boa sorte.