|
@@ -85,7 +85,7 @@ THREE.GodRaysGenerateShader = {
|
|
|
value: 1.0
|
|
|
},
|
|
|
vSunPositionScreenSpace: {
|
|
|
- value: new THREE.Vector2( 0.5, 0.5 )
|
|
|
+ value: new THREE.Vector3()
|
|
|
}
|
|
|
|
|
|
},
|
|
@@ -111,14 +111,14 @@ THREE.GodRaysGenerateShader = {
|
|
|
|
|
|
"uniform sampler2D tInput;",
|
|
|
|
|
|
- "uniform vec2 vSunPositionScreenSpace;",
|
|
|
+ "uniform vec3 vSunPositionScreenSpace;",
|
|
|
"uniform float fStepSize;", // filter step size
|
|
|
|
|
|
"void main() {",
|
|
|
|
|
|
// delta from current pixel to "sun" position
|
|
|
|
|
|
- " vec2 delta = vSunPositionScreenSpace - vUv;",
|
|
|
+ " vec2 delta = vSunPositionScreenSpace.xy - vUv;",
|
|
|
" float dist = length( delta );",
|
|
|
|
|
|
// Step vector (uv space)
|
|
@@ -157,22 +157,24 @@ THREE.GodRaysGenerateShader = {
|
|
|
|
|
|
// Unrolling loop manually makes it work in ANGLE
|
|
|
|
|
|
- " if ( 0.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;",
|
|
|
+ " float f = min( 1.0, max( vSunPositionScreenSpace.z / 1000.0, 0.0 ) );", // used to fade out godrays
|
|
|
+
|
|
|
+ " if ( 0.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;",
|
|
|
" uv += stepv;",
|
|
|
|
|
|
- " if ( 1.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;",
|
|
|
+ " if ( 1.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;",
|
|
|
" uv += stepv;",
|
|
|
|
|
|
- " if ( 2.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;",
|
|
|
+ " if ( 2.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;",
|
|
|
" uv += stepv;",
|
|
|
|
|
|
- " if ( 3.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;",
|
|
|
+ " if ( 3.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;",
|
|
|
" uv += stepv;",
|
|
|
|
|
|
- " if ( 4.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;",
|
|
|
+ " if ( 4.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;",
|
|
|
" uv += stepv;",
|
|
|
|
|
|
- " if ( 5.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r;",
|
|
|
+ " if ( 5.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;",
|
|
|
" uv += stepv;",
|
|
|
|
|
|
// Should technically be dividing by 'iters', but 'TAPS_PER_PASS' smooths out
|
|
@@ -210,10 +212,6 @@ THREE.GodRaysCombineShader = {
|
|
|
|
|
|
fGodRayIntensity: {
|
|
|
value: 0.69
|
|
|
- },
|
|
|
-
|
|
|
- vSunPositionScreenSpace: {
|
|
|
- value: new THREE.Vector2( 0.5, 0.5 )
|
|
|
}
|
|
|
|
|
|
},
|
|
@@ -238,7 +236,6 @@ THREE.GodRaysCombineShader = {
|
|
|
"uniform sampler2D tColors;",
|
|
|
"uniform sampler2D tGodRays;",
|
|
|
|
|
|
- "uniform vec2 vSunPositionScreenSpace;",
|
|
|
"uniform float fGodRayIntensity;",
|
|
|
|
|
|
"void main() {",
|
|
@@ -267,7 +264,7 @@ THREE.GodRaysFakeSunShader = {
|
|
|
uniforms: {
|
|
|
|
|
|
vSunPositionScreenSpace: {
|
|
|
- value: new THREE.Vector2( 0.5, 0.5 )
|
|
|
+ value: new THREE.Vector3()
|
|
|
},
|
|
|
|
|
|
fAspect: {
|
|
@@ -301,7 +298,7 @@ THREE.GodRaysFakeSunShader = {
|
|
|
|
|
|
"varying vec2 vUv;",
|
|
|
|
|
|
- "uniform vec2 vSunPositionScreenSpace;",
|
|
|
+ "uniform vec3 vSunPositionScreenSpace;",
|
|
|
"uniform float fAspect;",
|
|
|
|
|
|
"uniform vec3 sunColor;",
|
|
@@ -309,7 +306,7 @@ THREE.GodRaysFakeSunShader = {
|
|
|
|
|
|
"void main() {",
|
|
|
|
|
|
- " vec2 diff = vUv - vSunPositionScreenSpace;",
|
|
|
+ " vec2 diff = vUv - vSunPositionScreenSpace.xy;",
|
|
|
|
|
|
// Correct for aspect ratio
|
|
|
|
|
@@ -318,7 +315,7 @@ THREE.GodRaysFakeSunShader = {
|
|
|
" float prop = clamp( length( diff ) / 0.5, 0.0, 1.0 );",
|
|
|
" prop = 0.35 * pow( 1.0 - prop, 3.0 );",
|
|
|
|
|
|
- " gl_FragColor.xyz = mix( sunColor, bgColor, 1.0 - prop );",
|
|
|
+ " gl_FragColor.xyz = ( vSunPositionScreenSpace.z > 0.0 ) ? mix( sunColor, bgColor, 1.0 - prop ) : bgColor;",
|
|
|
" gl_FragColor.w = 1.0;",
|
|
|
|
|
|
"}"
|