Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- out vec4 FragColor;
- uniform samplerCube cubemap;
- uniform vec3 sphere_pos;
- uniform vec3 eyePos;
- uniform float rad_inner;
- uniform float rad_outer;
- uniform mat4 rot;
- in vec3 fragment_position;
- #define MARCHING_STEPS 128
- const float EPSILON = 0.0001f;
- vec4 sample(vec3 pos){
- return texture(cubemap, vec3(rot * vec4(pos - sphere_pos, 1)));
- }
- vec3 color(vec3 pos){
- return sample(pos).xyz;
- }
- float height(vec3 pos){
- return sample(pos).a * 255.0;
- }
- #include RaySphereIntersect.shad
- float RayMarch(vec3 eye, vec3 dir, float start, float end){
- float distance = start;
- float inc = (end - start) / MARCHING_STEPS;
- for(int i = 0; i < MARCHING_STEPS; i++){
- vec3 curPos = eye + dir * distance;
- float height = height(curPos) + rad_inner;
- if(length(curPos - sphere_pos) <= height ){
- return distance;
- }
- distance += inc;
- }
- return -1;
- }
- void main(){
- float eye_frag_dist = length(fragment_position - eyePos);
- vec3 norm_eye_frag = normalize(fragment_position - eyePos);
- vec2 intersect_inner = raySphereIntersect(eyePos, norm_eye_frag, sphere_pos, rad_inner);
- vec2 intersect_outer = raySphereIntersect(eyePos, norm_eye_frag, sphere_pos, rad_outer);
- float close, far;
- close = intersect_outer.x;
- if(intersect_inner.x <= -1.0){ //no inner intersection
- if(close <= -1.0){ //no outer intersection
- discard;
- }
- far = intersect_outer.y;
- //passes through atmosphere
- }else{
- far = intersect_inner.x;
- }
- float dist = RayMarch(eyePos, norm_eye_frag, close, far);
- if(dist <= -1){
- discard;
- }
- vec3 p = eyePos + dist * norm_eye_frag;
- FragColor = vec4(color(p), 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement