Advertisement
Guest User

Untitled

a guest
Jul 29th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. out vec4 FragColor;
  2. uniform samplerCube cubemap;
  3. uniform vec3 sphere_pos;
  4. uniform vec3 eyePos;
  5. uniform float rad_inner;
  6. uniform float rad_outer;
  7. uniform mat4 rot;
  8. in vec3 fragment_position;
  9.  
  10. #define MARCHING_STEPS 128
  11. const float EPSILON = 0.0001f;
  12.  
  13. vec4 sample(vec3 pos){
  14.     return texture(cubemap, vec3(rot * vec4(pos - sphere_pos, 1)));
  15. }
  16.  
  17. vec3 color(vec3 pos){
  18.     return sample(pos).xyz;
  19. }
  20.  
  21. float height(vec3 pos){
  22.     return sample(pos).a * 255.0;
  23. }
  24.  
  25. #include RaySphereIntersect.shad
  26.  
  27. float RayMarch(vec3 eye, vec3 dir, float start, float end){
  28.     float distance = start;
  29.     float inc = (end - start) / MARCHING_STEPS;
  30.     for(int i = 0; i < MARCHING_STEPS; i++){
  31.         vec3 curPos = eye + dir * distance;
  32.         float height = height(curPos) + rad_inner;
  33.         if(length(curPos - sphere_pos) <= height ){
  34.             return distance;
  35.         }
  36.         distance += inc;
  37.     }
  38.     return -1;
  39. }
  40.  
  41. void main(){
  42.     float eye_frag_dist = length(fragment_position - eyePos);
  43.     vec3 norm_eye_frag = normalize(fragment_position - eyePos);
  44.  
  45.     vec2 intersect_inner = raySphereIntersect(eyePos, norm_eye_frag, sphere_pos, rad_inner);
  46.     vec2 intersect_outer = raySphereIntersect(eyePos, norm_eye_frag, sphere_pos, rad_outer);
  47.  
  48.     float close, far;
  49.  
  50.     close = intersect_outer.x;
  51.  
  52.     if(intersect_inner.x <= -1.0){ //no inner intersection
  53.         if(close <= -1.0){ //no outer intersection
  54.             discard;
  55.         }
  56.         far = intersect_outer.y;
  57.         //passes through atmosphere
  58.     }else{
  59.         far = intersect_inner.x;
  60.     }
  61.  
  62.    float dist = RayMarch(eyePos, norm_eye_frag, close, far);
  63.  
  64.    if(dist  <= -1){
  65.         discard;
  66.    }
  67.  
  68.    vec3 p = eyePos + dist * norm_eye_frag;
  69.  
  70.    FragColor = vec4(color(p), 1);
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement