     return mix(vec3(0.0), ret, smoothstep(1.0,0.98,dot(uv,uv)) );
 }
 
-vec2 fishEye(vec2 _uv, float _aperture){
-    float apertureHalf = 0.5 * _aperture;
-    float maxFactor = sin(apertureHalf);
+vec2 sphereCoords(vec2 _st, float _scale){
+    float maxFactor = sin(1.570796327);
     vec2 uv = vec2(0.0);
-    vec2 xy = 2.0 * _uv.xy - 1.0;
+    vec2 xy = 2.0 * _st.xy - 1.0;
     float d = length(xy);
     if (d < (2.0-maxFactor)){
         d = length(xy * maxFactor);
         float z = sqrt(1.0 - d * d);
-        float r = atan(d, z) / PI;
+        float r = atan(d, z) / 3.1415926535 * _scale;
         float phi = atan(xy.y, xy.x);
 
         uv.x = r * cos(phi) + 0.5;
         uv.y = r * sin(phi) + 0.5;
     } else {
-        uv = _uv.xy;
+        uv = _st.xy;
     }
     return uv;
 }

    vec3 normal = normalize(sphereNormal(st)*2.0-1.0);

    if(u_tex0resolution != vec2(0.0)){
        normal += texture2D(u_tex0, fishEye(st, PI)).rgb*2.0-1.0;
        normal = normalize(normal);
    }
    

PointLight a = PointLight(Light(vec3(0.1),vec3(0.0,0.5,0.8),vec3(0.0,1.0,1.0)),vec3(1.0));
PointLight b = PointLight(Light(vec3(0.25),vec3(0.8,0.5,0.0),vec3(1.0,1.0,0.0)),vec3(1.0));

void main(){
    vec2 st = gl_FragCoord.xy/u_resolution.xy;
    vec3 color = vec3(0.0);
