You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
4.9 KiB
194 lines
4.9 KiB
//Star Nest algorithm by Pablo Román Andrioli |
|
//Unity 5.x shader by Jonathan Cohen |
|
//This content is under the MIT License. |
|
// |
|
//Original Shader: |
|
//https://www.shadertoy.com/view/XlfGRj |
|
// |
|
//This shader uses the same algorithm in 3d space to render a skybox. |
|
|
|
Shader "FX/Galaxy" { |
|
Properties { |
|
_MainTex ("Texture Sampler (UV Only)", 2D) = "grey" {} |
|
|
|
|
|
//2D: Zoom level |
|
_Zoom ("Zoom", Float) = 800 |
|
|
|
_Color ("Main Color", Color) = (1,1,1,1) |
|
|
|
[Toggle(CLAMPOUT)] _CLAMPOUT("Clamp Output with Main Color", Float) = 0 |
|
|
|
//Scrolls in this direction over time. Set 'w' to zero to stop scrolling. |
|
_Scroll ("Scrolling direction (x,y,z) * w * time", Vector) = (3, 1, .6, .01) |
|
|
|
//Center position in space and time. |
|
_Center ("Center Position (x, y, z, time)", Vector) = (1, .3, .5, 0) |
|
|
|
//Rotation angles |
|
_Rotation ("Rotation (x,y,z)*w angles", Vector) = (35, 25, 75, .1) |
|
|
|
//Iterations of inner loop. |
|
//The higher this is, the more distant objects get rendered. |
|
_Iterations ("Iterations", Range(1, 30)) = 17 |
|
|
|
//Volumetric rendering steps. Each 'step' renders more objects at all distances. |
|
//This has a higher performance hit than iterations. |
|
_Volsteps ("Volumetric Steps", Range(1,40)) = 20 |
|
|
|
//Magic number. Best values are around 400-600. |
|
_Formuparam ("Formuparam", Float) = 530 |
|
|
|
//How much farther each volumestep goes |
|
_StepSize ("Step Size", Float) = 130 |
|
|
|
//Fractal repeating rate |
|
//Low numbers are busy and give lots of repititio |
|
//High numbers are very sparce |
|
_Tile ("Tile", Float) = 700 |
|
|
|
//Brightness scale. |
|
_Brightness ("Brightness", Float) = 2 |
|
//Abundance of Dark matter (in the distance). |
|
//Visible with Volsteps >= 8 (at 7 its really, really hard to see) |
|
_Darkmatter ("Dark Matter", Float) = 25 |
|
//Brightness of distant objects (or dim) are distant objects |
|
//Ironically, Also affets brightness of 'darkmatter' |
|
_Distfading ("Distance Fading", Float) = 68 |
|
//How much color is present? |
|
_Saturation ("Saturation", Float) = 85 |
|
|
|
} |
|
|
|
SubShader { |
|
Tags { "Queue"="Geometry" "RenderType"="Opaque" } |
|
Cull Off |
|
|
|
|
|
CGPROGRAM |
|
|
|
|
|
#pragma surface surf Lambert |
|
#pragma multi_compile __ CLAMPOUT |
|
#include "UnityCG.cginc" |
|
|
|
fixed4 _Color; |
|
|
|
int _Volsteps; |
|
int _Iterations; |
|
sampler2D _MainTex; |
|
|
|
float4 _Scroll; |
|
float4 _Center; |
|
float _CamScroll; |
|
float4 _Rotation; |
|
|
|
float _Formuparam; |
|
float _StepSize; |
|
|
|
float _Zoom; |
|
|
|
float _Tile; |
|
|
|
float _Brightness; |
|
float _Darkmatter; |
|
float _Distfading; |
|
float _Saturation; |
|
|
|
struct Input { |
|
float2 uv_MainTex; |
|
}; |
|
|
|
|
|
|
|
void surf (Input IN, inout SurfaceOutput o) { |
|
half3 col = half3(0, 0, 0); |
|
float zoom = _Zoom / 1000; |
|
float2 uv = IN.uv_MainTex; |
|
uv -= .5; |
|
|
|
half3 dir = float3(uv * zoom, 1); |
|
|
|
float time = _Center.w + _Time.x; |
|
|
|
//Un-scale parameters (source parameters for these are mostly in 0...1 range) |
|
//Scaling them up makes it much easier to fine-tune shader in the inspector. |
|
float brightness = _Brightness / 1000; |
|
float stepSize = _StepSize / 1000; |
|
float3 tile = abs(float3(_Tile, _Tile, _Tile)) / 1000; |
|
float formparam = _Formuparam / 1000; |
|
|
|
float darkmatter = _Darkmatter / 100; |
|
float distFade = _Distfading / 100; |
|
|
|
float3 from = _Center.xyz; |
|
|
|
//scroll over time |
|
from += _Scroll.xyz * _Scroll.w * time; |
|
//scroll from camera position |
|
//from += _WorldSpaceCameraPos * _CamScroll * .00001; |
|
|
|
|
|
//Apply rotation if enabled |
|
float3 rot = _Rotation.xyz * _Rotation.w; |
|
if (length(rot) > 0) { |
|
float2x2 rx = float2x2(cos(rot.x), sin(rot.x), -sin(rot.x), cos(rot.x)); |
|
float2x2 ry = float2x2(cos(rot.y), sin(rot.y), -sin(rot.y), cos(rot.y)); |
|
float2x2 rz = float2x2(cos(rot.z), sin(rot.z), -sin(rot.z), cos(rot.z)); |
|
|
|
dir.xy = mul(rz, dir.xy); |
|
dir.xz = mul(ry, dir.xz); |
|
dir.yz = mul(rx, dir.yz); |
|
from.xy = mul(rz, from.xy); |
|
from.xz = mul(ry, from.xz); |
|
from.yz = mul(rx, from.yz); |
|
} |
|
|
|
|
|
//volumetric rendering |
|
float s = 0.1, fade = 1.0; |
|
float3 v = float3(0, 0, 0); |
|
for (int r = 0; r < _Volsteps; r++) { |
|
float3 p = abs(from + s * dir * .5); |
|
|
|
p = abs(float3(tile - fmod(p, tile*2))); |
|
float pa,a = pa = 0.; |
|
for (int i = 0; i < _Iterations; i++) { |
|
p = abs(p) / dot(p, p) - formparam; |
|
a += abs(length(p) - pa); |
|
pa = length(p); |
|
} |
|
//Dark matter |
|
float dm = max(0., darkmatter - a * a * .001); |
|
if (r > 6) { fade *= 1. - dm; } // Render distant darkmatter |
|
a *= a * a; //add contrast |
|
|
|
v += fade; |
|
|
|
// coloring based on distance |
|
v += float3(s, s*s, s*s*s*s) * a * brightness * fade; |
|
|
|
// distance fading |
|
fade *= distFade; |
|
s += stepSize; |
|
} |
|
|
|
float len = length(v); |
|
//Quick color saturate |
|
v = lerp(float3(len, len, len), v, _Saturation / 100); |
|
v.xyz *= _Color.xyz * .01; |
|
|
|
#ifdef CLAMPOUT |
|
v = clamp(v, float3(0,0,0), _Color.xyz); |
|
#endif |
|
o.Emission = float3(v * .01); |
|
} |
|
|
|
|
|
|
|
ENDCG |
|
|
|
} |
|
|
|
Fallback Off |
|
}
|
|
|