Managing superposition of celestial objects in passing over each other

This commit is contained in:
yannk 2022-04-14 17:41:23 +02:00
parent 4e94507ac0
commit d91b9ea126
2 changed files with 25 additions and 24 deletions

View file

@ -32,11 +32,11 @@ shader_param/ground_color = Color(0.1, 0.07, 0.034, 1)
shader_param/exposure = 0.1
shader_param/dither_strength = 1.0
shader_param/samayun_arc = 50.0
shader_param/samayun_position = Vector3(2.038, 0.584, -0.995)
shader_param/samayun_position = Vector3(2.038, 0.695, -0.296)
shader_param/zabr_arc = 15.0
shader_param/zabr_position = Vector3(0.6, 0.03, -0.342)
shader_param/stigi_arc = null
shader_param/stigi_position = Vector3(0.688, 0.03, -0.342)
shader_param/zabr_position = Vector3(1.755, 0.627, 0.768)
shader_param/stigi_arc = 8.381
shader_param/stigi_position = Vector3(0.925, 0.277, 0.17)
shader_param/samayun = ExtResource( "1_thm7k" )
shader_param/zabr = ExtResource( "3_bgghj" )
shader_param/stigi = ExtResource( "3_jqgsm" )

View file

@ -58,8 +58,8 @@ vec2 place_object(vec3 position, vec3 eyedir){
vec3 n1 = normalize(cross(position,vec3(0.0,1.0,0.0))) ;
vec3 n2 = normalize(cross(position,n1)) ;
//We project EYEDIR on this plane with an approximate correction for projection
float x = dot(eyedir,n1) * 0.89 ;
float y = dot(eyedir,n2) * 0.89 ;
float x = dot(eyedir,n1) * 0.9 ;
float y = dot(eyedir,n2) * 0.9 ;
return vec2(x, y);
}
@ -121,34 +121,35 @@ void sky() {
float samayun_scale = radians(samayun_arc) ;
float zabr_scale = radians(zabr_arc) ;
float stigi_scale = radians(stigi_arc) ;
// Calculate respective plane with UV to place celestial object textures
vec2 samayun_uv = place_object(samayun_position, EYEDIR) ;
vec2 zabr_uv = place_object(zabr_position, EYEDIR) ;
vec2 stigi_uv = place_object(stigi_position, EYEDIR) ;
// Adding Samayun
// Adding the celestial objects from the nearest to the farest
// Adding stigi
if (length(EYEDIR - normalize(stigi_position)) < stigi_scale / 2.0){ // we are in the area of the sky where stigi is placed
COLOR += texture(stigi, stigi_uv / stigi_scale + vec2(0.5)).rgb * texture(stigi, stigi_uv / stigi_scale + vec2(0.5)).a;
}
// Adding samayun
if (length(EYEDIR - normalize(samayun_position)) < samayun_scale / 2.0) { // we are in the area of the sky where samayun is placed
// If zabr is nearer at this place, do nothing
if (length(EYEDIR - normalize(zabr_position)) < zabr_scale / 2.0 && length(zabr_position) < length(samayun_position)){
} else { // // Add samayun to the sky
if (length(EYEDIR - normalize(stigi_position)) < stigi_scale / 2.0){ // if stigi is in front of samayun, dont draw where stigi alpha is > 0
COLOR += texture(samayun, samayun_uv / samayun_scale + vec2(0.5)).rgb * max((texture(samayun, samayun_uv / samayun_scale + vec2(0.5)).a - texture(stigi, stigi_uv / stigi_scale + vec2(0.5)).a), 0.0) ;
} else {
COLOR += texture(samayun, samayun_uv / samayun_scale + vec2(0.5)).rgb * texture(samayun, samayun_uv / samayun_scale + vec2(0.5)).a;
}
}
// Adding zabr
if (length(EYEDIR - normalize(zabr_position)) < zabr_scale / 2.0) { // we are in the area of the sky where zabr is placed
// If samayun is nearer at this place, do nothing
if (length(EYEDIR - normalize(samayun_position)) < samayun_scale / 2.0 && length(samayun_position) < length(zabr_position)){
} else { // Add zabr to the sky
if (length(EYEDIR - normalize(samayun_position)) < samayun_scale / 2.0){ // if samayun is in front of zabr, dont draw where samayun alpha is > 0
COLOR += texture(zabr, zabr_uv / zabr_scale + vec2(0.5)).rgb * max((texture(zabr, zabr_uv / zabr_scale + vec2(0.5)).a - texture(samayun, samayun_uv / samayun_scale + vec2(0.5)).a), 0.0);
} else {
if (length(EYEDIR - normalize(stigi_position)) < stigi_scale / 2.0){ // if stigi is in front of zabr, dont draw where its alpha is > 0
COLOR += texture(zabr, zabr_uv / zabr_scale + vec2(0.5)).rgb * (texture(zabr, zabr_uv / zabr_scale + vec2(0.5)).a - texture(stigi, stigi_uv / stigi_scale + vec2(0.5)).a);
} else {
COLOR += texture(zabr, zabr_uv / zabr_scale + vec2(0.5)).rgb * texture(zabr, zabr_uv / zabr_scale + vec2(0.5)).a;
}
}
// Adding stigi
if (length(EYEDIR - normalize(stigi_position)) < stigi_scale / 2.0) { // we are in the area of the sky where stigi is placed
// If samayun is nearer at this place, do nothing
if (length(EYEDIR - normalize(samayun_position)) < samayun_scale / 2.0 && length(samayun_position) < length(stigi_position)){
} else { // Add stigi to the sky
COLOR += texture(stigi, stigi_uv / stigi_scale + vec2(0.5)).rgb * texture(stigi, stigi_uv / stigi_scale + vec2(0.5)).a;
}
}
}
}
}