1
0
web/static/pkg/solar/js/shaders.js
2024-05-12 07:41:57 +09:00

130 lines
4.1 KiB
JavaScript

var generalVS = `
varying vec2 vUv;
varying vec3 vNormal;
void main() {
vUv = uv;
vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
vNormal = normalMatrix * normal;
gl_Position = projectionMatrix * mvPosition;
}
`;
var nightFS = `
uniform sampler2D nightTexture;
varying vec2 vUv;
varying vec3 vNormal;
void main( void ) {
vec4 nightColor = vec4(texture2D( nightTexture, vUv ).rgb, 1.0);
vec4 dayColor = vec4(0, 0, 0, 0);
vec3 sunDirection = vec3(viewMatrix * vec4(0, 0, 0, 1));
// compute cosine sun to normal so -1 is away from sun and +1 is toward sun.
float cosineAngleSunToNormal = dot(normalize(vNormal), sunDirection);
// sharpen the edge beween the transition
cosineAngleSunToNormal = clamp( cosineAngleSunToNormal / 100.0, -1.0, 1.0);
// convert to 0 to 1 for mixing
float mixAmount = cosineAngleSunToNormal * 0.5 + 0.5;
// Select day or night texture based on mixAmount.
vec4 color = mix( nightColor, dayColor, mixAmount );
gl_FragColor += vec4(color);
// comment in the next line to see the mixAmount
//gl_FragColor = vec4( mixAmount, mixAmount, mixAmount, 1.0 );
}
`;
// This stuff works, currently we do not use the scattering model
var atmosphereVS = `
varying float intensity1;
varying float intensity2;
const float PI = 3.14159265358979;
void main(void) {
// Vertex position in world coordinate
vec4 vertexPos = modelMatrix * vec4(position, 1.0);
vec3 vertexPos3 = vertexPos.xyz/vertexPos.w;
// Vertex light position in world coordinate
vec4 lightPos = vec4(0., 0., 0., 1.);
vec3 lightPos3 = lightPos.xyz/lightPos.w;
// Light direction in world coordinate
// Normal vector in world coordinate
// Model view position of the vertex
vec4 modelViewPos = modelViewMatrix * vec4(position, 1.0);
// Camera
vec4 centerPos4 = modelMatrix * vec4(0., 0., 0., 1.);
vec3 centerPos3 = (centerPos4/centerPos4.w).xyz;
vec3 cameraRelative = cameraPosition - centerPos3;
vec3 cameraDir = normalize(cameraRelative);
vec3 lightDir = normalize(lightPos3 - vertexPos3);
vec3 normalVec = (modelMatrix * vec4(normal, 0.)).xyz;
vec3 halfNormalVec = normalize(normalVec + cameraDir);
intensity1 = 0.5*dot(lightDir, normalVec + 0.5 * lightDir) * dot(cameraDir + 0.5*lightDir, lightDir) * (1. - pow(dot(cameraDir, normalVec), 1.5));
intensity2 = 1.5*dot(lightDir, normalVec + lightDir) * (1. - dot(cameraDir + 1.5*lightDir, lightDir)/2.5) * (1. - dot(cameraDir, normalVec));
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;
// Atomosphere fragment shader
var atmosphereFS = `
varying float intensity1;
varying float intensity2;
uniform vec3 atmosphereColor;
uniform vec3 sunsetColor;
uniform float atmosphereStrength;
uniform float sunsetStrength;
void main(void) {
gl_FragColor = vec4(atmosphereStrength * intensity1 * atmosphereColor
+ sunsetStrength * intensity2 * sunsetColor, intensity1 + intensity2);
}
`;
var haloVS = `
varying float intensity;
const float PI = 3.14159265358979;
void main(void) {
// Vertex position in world coordinate
vec4 vertexPos = modelMatrix * vec4(position, 1.0);
vec3 vertexPos3 = vertexPos.xyz/vertexPos.w;
// Light direction in world coordinate
// Normal vector in world coordinate
// Model view position of the vertex
vec4 modelViewPos = modelViewMatrix * vec4(position, 1.0);
float distance = length(cameraPosition);
// Camera
vec4 centerPos4 = modelMatrix * vec4(0., 0., 0., 1.);
vec3 centerPos3 = (centerPos4/centerPos4.w).xyz;
vec3 cameraRelative = cameraPosition - centerPos3;
vec3 cameraDir = normalize(cameraRelative);
vec3 normalVec = (modelMatrix * vec4(normal, 0.)).xyz;
// pow(dot(normalVec, cameraDir), 4.) *
intensity = pow(dot(normalVec, cameraDir), 4.) * min(distance / 2000., 1.);
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;
// Atomosphere fragment shader
var haloFS = `
varying float intensity;
uniform vec3 color;
void main(void) {
gl_FragColor = vec4(intensity * color, intensity);
}
`;