Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
359 changes: 29 additions & 330 deletions README.md

Large diffs are not rendered by default.

113 changes: 90 additions & 23 deletions frag_globe.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,42 +64,109 @@
uniform float u_time;
uniform mat4 u_InvTrans;

//for height map
uniform vec3 low_color;
uniform vec3 high_color;

varying vec3 v_Normal; // surface normal in camera coordinates
varying vec2 v_Texcoord;
varying vec3 v_Position; // position in camera coordinates
varying vec3 v_positionMC; // position in model coordinates

mat3 eastNorthUpToEyeCoordinates(vec3 positionMC, vec3 normalEC);
//random generator from http://www.java-gaming.org/index.php?topic=28018.0
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

void main(void)

void main(void)
{
// surface normal - normalized after rasterization
vec3 normal = normalize(v_Normal);
float night_flag=dot(v_Normal,u_CameraSpaceDirLight);
// normalized eye-to-position vector in camera coordinates
vec3 eyeToPosition = normalize(v_Position);
//for specular map
vec3 maskColor=texture2D(u_Bump,v_Texcoord).rgb;

//bump map
vec2 bump_center_coord=v_Texcoord;
vec2 bump_right_coord=bump_center_coord+vec2(1.0/1024.0,0.0);
vec2 bump_top_coord=bump_center_coord+vec2(0.0,1.0/512.0);
float bump_center=texture2D(u_Bump,bump_center_coord).x;
float bump_right=texture2D(u_Bump,bump_right_coord).x;
float bump_top=texture2D(u_Bump,bump_top_coord).x;



vec3 bump_normal=eastNorthUpToEyeCoordinates(v_positionMC,v_Normal)*normalize(vec3(bump_center-bump_right,bump_center-bump_top,0.15));

float bump_diffuse=clamp(dot(-u_CameraSpaceDirLight, bump_normal), 0.0, 1.0);

float diffuse = clamp(dot(-u_CameraSpaceDirLight, normal), 0.0, 1.0);

vec3 toReflectedLight = reflect(-u_CameraSpaceDirLight, normal);
float specular = max(dot(toReflectedLight, eyeToPosition), 0.0);
specular = pow(specular, 20.0);

float gammaCorrect = 1.0/1.3; //gamma correct by 1/1.2

vec3 dayColor = texture2D(u_DayDiffuse, v_Texcoord).rgb;
vec3 nightColor = texture2D(u_Night, v_Texcoord).rgb;
//apply gamma correction to nighttime texture
nightColor = pow(nightColor,vec3(gammaCorrect));

if(maskColor.r>0.0)
{
specular=0.0;
}
if(maskColor.r==0.0)
{
bump_diffuse+=(rand(v_Texcoord*u_time*0.1)+rand(v_positionMC.xy*u_time*0.1))*0.3;
}
vec3 day_color = ((0.9 * bump_diffuse) + (0.5 * specular)) * dayColor;
//for height map
float altitude=texture2D(u_Bump,v_Texcoord).r;
if(altitude<0.5)
{
day_color=mix(day_color,low_color,0.1);
}
else
{
day_color=mix(day_color,high_color,0.1);
}




//for clouds
vec2 v_cloud=v_Texcoord+vec2(u_time*0.25,0.0);
//vec2 v_cloud=v_Texcoord;
//v_cloud+=vec2(u_time,u_time);
vec3 cloudColor=texture2D(u_Cloud,v_cloud).rgb;
vec3 cloudTrans=texture2D(u_CloudTrans,v_cloud).rgb;
//day cloud
vec3 dayCloud=cloudColor;
vec3 nightCloud=vec3(0.0,0.0,0.0);
//mixed day and night cloud
vec3 mixed_dayColor=mix(dayCloud*0.8,day_color,cloudTrans.r);
vec3 mixed_nightColor=mix(nightCloud,nightColor,cloudTrans.r);

vec3 color=mix(mixed_dayColor,mixed_nightColor,(night_flag+1.0)/2.0);
float rimfactor=clamp(dot(v_Normal,v_Position)+1.0,0.0,0.5);
if(rimfactor>0.0)
{
// surface normal - normalized after rasterization
vec3 normal = normalize(v_Normal);
// normalized eye-to-position vector in camera coordinates
vec3 eyeToPosition = normalize(v_Position);

float diffuse = clamp(dot(u_CameraSpaceDirLight, normal), 0.0, 1.0);

vec3 toReflectedLight = reflect(-u_CameraSpaceDirLight, normal);
float specular = max(dot(toReflectedLight, -eyeToPosition), 0.0);
specular = pow(specular, 20.0);

float gammaCorrect = 1.0/1.2; //gamma correct by 1/1.2

vec3 dayColor = texture2D(u_DayDiffuse, v_Texcoord).rgb;
vec3 nightColor = texture2D(u_Night, v_Texcoord).rgb;
//apply gamma correction to nighttime texture
nightColor = pow(nightColor,vec3(gammaCorrect));

vec3 color = ((0.6 * diffuse) + (0.4 * specular)) * dayColor;
gl_FragColor = vec4(color, 1.0);
color+=vec3(rimfactor/4.0,rimfactor/2.0,rimfactor/2.0);
}
gl_FragColor = vec4(color, 1.0);
}

mat3 eastNorthUpToEyeCoordinates(vec3 positionMC, vec3 normalEC)
{
// normalized surface tangent in model coordinates
vec3 tangentMC = normalize(vec3(-positionMC.z, positionMC.x, 0.0));
// normalized surface tangent in eye coordiantes
vec3 tangentMC = normalize(vec3(-positionMC.z, positionMC.x, 0.0));
// normalized surface tangent in eye coordiantes
vec3 tangentEC = normalize(mat3(u_InvTrans) * tangentMC);
// normalized surface bitangent in eye coordinates
vec3 bitangentEC = normalize(cross(normalEC, tangentEC));
Expand Down
15 changes: 13 additions & 2 deletions js/frag_globe.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@
var u_EarthSpecLocation;
var u_BumpLocation;
var u_timeLocation;
var low_colorLocation;
var high_colorLocation;
var lowColor=[1.0,0.0,0.0,0.0];
var highColor=[0.0,0.0,1.0,0.0];


(function initializeShader() {
var vs = getShaderSource(document.getElementById("vs"));
Expand All @@ -76,6 +81,8 @@
u_BumpLocation = gl.getUniformLocation(program,"u_Bump");
u_timeLocation = gl.getUniformLocation(program,"u_time");
u_CameraSpaceDirLightLocation = gl.getUniformLocation(program,"u_CameraSpaceDirLight");
low_colorLocation=gl.getUniformLocation(program,"low_color");
high_colorLocation=gl.getUniformLocation(program,"high_color");

gl.useProgram(program);
})();
Expand Down Expand Up @@ -265,9 +272,12 @@
gl.uniformMatrix4fv(u_ViewLocation, false, view);
gl.uniformMatrix4fv(u_PerspLocation, false, persp);
gl.uniformMatrix4fv(u_InvTransLocation, false, invTrans);

gl.uniform1f(u_timeLocation,time);
gl.uniform3fv(u_CameraSpaceDirLightLocation, lightdir);

gl.uniform3fv(low_colorLocation,lowColor);
gl.uniform3fv(high_colorLocation,highColor);


gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, dayTex);
gl.uniform1i(u_DayDiffuseLocation, 0);
Expand All @@ -287,6 +297,7 @@
gl.bindTexture(gl.TEXTURE_2D, specTex);
gl.uniform1i(u_EarthSpecLocation, 5);
gl.drawElements(gl.TRIANGLES, numberOfIndices, gl.UNSIGNED_SHORT,0);


time += 0.001;
window.requestAnimFrame(animate);
Expand Down
Loading