@openglobus/og 0.14.10 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/og.css +378 -275
- package/dist/@openglobus/og.css +1 -1
- package/dist/@openglobus/og.esm.js +2 -2
- package/dist/@openglobus/og.esm.js.map +1 -1
- package/dist/@openglobus/og.umd.js +2 -2
- package/dist/@openglobus/og.umd.js.map +1 -1
- package/package.json +18 -17
- package/src/og/Clock.js +218 -194
- package/src/og/Globe.js +5 -5
- package/src/og/Object3d.js +104 -145
- package/src/og/camera/Camera.js +31 -27
- package/src/og/camera/PlanetCamera.js +22 -14
- package/src/og/cons.js +107 -107
- package/src/og/control/Atmosphere.js +396 -0
- package/src/og/control/CompassButton.js +11 -18
- package/src/og/control/Control.js +187 -188
- package/src/og/control/GeoImageDragControl.js +84 -66
- package/src/og/control/LayerSwitcher.js +56 -138
- package/src/og/control/Lighting.js +314 -186
- package/src/og/control/MouseNavigation.js +2 -2
- package/src/og/control/RulerSwitcher.js +24 -19
- package/src/og/control/ScaleControl.js +30 -10
- package/src/og/control/SimpleSkyBackground.js +210 -0
- package/src/og/control/Sun.js +2 -0
- package/src/og/control/ZoomControl.js +30 -42
- package/src/og/control/index.js +6 -0
- package/src/og/control/ruler/RulerScene.js +5 -23
- package/src/og/control/selection/Selection.js +99 -0
- package/src/og/control/selection/SelectionScene.js +350 -0
- package/src/og/control/timeline/TimelineControl.js +99 -0
- package/src/og/control/timeline/TimelineModel.js +133 -0
- package/src/og/control/timeline/TimelineView.js +449 -0
- package/src/og/control/timeline/timelineUtils.js +132 -0
- package/src/og/ellipsoid/Ellipsoid.js +120 -93
- package/src/og/ellipsoid/wgs84.js +13 -13
- package/src/og/entity/Entity.js +36 -9
- package/src/og/entity/EntityCollection.js +0 -2
- package/src/og/entity/GeoObject.js +72 -56
- package/src/og/entity/GeoObjectHandler.js +487 -656
- package/src/og/entity/GeometryHandler.js +1341 -1337
- package/src/og/entity/Polyline.js +0 -16
- package/src/og/entity/Ray.js +0 -10
- package/src/og/entity/RayHandler.js +3 -44
- package/src/og/entity/Strip.js +1 -6
- package/src/og/index.js +10 -6
- package/src/og/input/input.js +3 -1
- package/src/og/layer/CanvasTiles.js +39 -34
- package/src/og/layer/Layer.js +69 -9
- package/src/og/layer/Material.js +1 -8
- package/src/og/layer/WMS.js +16 -5
- package/src/og/light/LightSource.js +2 -0
- package/src/og/math/Line3.js +140 -139
- package/src/og/math/Plane.js +118 -117
- package/src/og/math/Ray.js +242 -239
- package/src/og/math/Vec3.js +56 -37
- package/src/og/math/Vec4.js +3 -4
- package/src/og/math.js +21 -21
- package/src/og/quadTree/Node.js +5 -4
- package/src/og/quadTree/index.js +12 -0
- package/src/og/renderer/Renderer.js +64 -37
- package/src/og/renderer/RendererEvents.js +1071 -1065
- package/src/og/scene/Planet.js +352 -172
- package/src/og/scene/RenderNode.js +27 -12
- package/src/og/segment/Segment.js +0 -5
- package/src/og/shaders/atmos.js +332 -0
- package/src/og/shaders/drawnode.js +475 -109
- package/src/og/shaders/geoObject.js +96 -51
- package/src/og/shaders/polyline.js +212 -17
- package/src/og/shaders/ray.js +13 -6
- package/src/og/shaders/toneMapping.js +5 -5
- package/src/og/shaders/utils.js +88 -0
- package/src/og/terrain/GlobusTerrain.js +5 -4
- package/src/og/terrain/MapboxTerrain.js +231 -52
- package/src/og/ui/Button.js +106 -0
- package/src/og/ui/ButtonGroup.js +57 -0
- package/src/og/ui/Dialog.js +242 -0
- package/src/og/ui/Slider.js +144 -0
- package/src/og/ui/ToggleButton.js +51 -0
- package/src/og/{control → ui}/UIhelpers.js +11 -2
- package/src/og/ui/View.js +190 -0
- package/src/og/utils/shared.js +960 -942
- package/src/og/webgl/Framebuffer.js +308 -387
- package/src/og/webgl/Handler.js +90 -30
- package/src/og/webgl/Multisample.js +8 -0
- package/types/Clock.d.ts +7 -2
- package/types/Object3d.d.ts +14 -3
- package/types/camera/Camera.d.ts +18 -17
- package/types/camera/PlanetCamera.d.ts +3 -1
- package/types/control/Atmosphere.d.ts +15 -0
- package/types/control/CompassButton.d.ts +1 -2
- package/types/control/GeoImageDragControl.d.ts +7 -1
- package/types/control/LayerSwitcher.d.ts +5 -6
- package/types/control/Lighting.d.ts +32 -7
- package/types/control/ScaleControl.d.ts +2 -1
- package/types/control/SimpleSkyBackground.d.ts +15 -0
- package/types/control/ZoomControl.d.ts +0 -1
- package/types/control/index.d.ts +4 -1
- package/types/control/ruler/RulerScene.d.ts +0 -1
- package/types/control/selection/Selection.d.ts +49 -0
- package/types/control/selection/SelectionScene.d.ts +34 -0
- package/types/ellipsoid/Ellipsoid.d.ts +3 -2
- package/types/entity/Entity.d.ts +8 -0
- package/types/entity/GeoObject.d.ts +28 -22
- package/types/entity/GeoObjectHandler.d.ts +16 -56
- package/types/entity/Ray.d.ts +0 -3
- package/types/entity/RayHandler.d.ts +0 -4
- package/types/index.d.ts +7 -5
- package/types/input/input.d.ts +2 -0
- package/types/layer/CanvasTiles.d.ts +1 -0
- package/types/layer/Layer.d.ts +9 -0
- package/types/layer/WMS.d.ts +7 -3
- package/types/math/Plane.d.ts +1 -1
- package/types/math/Vec3.d.ts +19 -16
- package/types/math/Vec4.d.ts +2 -3
- package/types/math.d.ts +20 -20
- package/types/quadTree/index.d.ts +10 -0
- package/types/renderer/Renderer.d.ts +11 -37
- package/types/scene/Planet.d.ts +27 -1
- package/types/scene/RenderNode.d.ts +2 -1
- package/types/segment/Segment.d.ts +1 -1
- package/types/shaders/atmos.d.ts +4 -0
- package/types/shaders/drawnode.d.ts +3 -2
- package/types/shaders/utils.d.ts +1 -0
- package/types/terrain/GlobusTerrain.d.ts +1 -1
- package/types/terrain/MapboxTerrain.d.ts +2 -1
- package/types/ui/Button.d.ts +21 -0
- package/types/ui/Dialog.d.ts +41 -0
- package/types/ui/Slider.d.ts +30 -0
- package/types/ui/ToggleButton.d.ts +10 -0
- package/types/{control → ui}/UIhelpers.d.ts +1 -1
- package/types/ui/View.d.ts +32 -0
- package/types/utils/shared.d.ts +16 -14
- package/types/webgl/Framebuffer.d.ts +2 -5
- package/types/webgl/Handler.d.ts +15 -10
- package/types/webgl/Multisample.d.ts +2 -0
- package/src/og/ajax.js +0 -204
- package/src/og/entity/Object3d.js +0 -504
- package/src/og/utils/quadTreeType.js +0 -11
- package/types/ajax.d.ts +0 -24
- package/types/utils/quadTreeType.d.ts +0 -8
|
@@ -46,7 +46,7 @@ class RenderNode extends BaseNode {
|
|
|
46
46
|
* @type {Array.<LightSource>}
|
|
47
47
|
*/
|
|
48
48
|
this._lights = [];
|
|
49
|
-
this.
|
|
49
|
+
this._lightsPositions = [];
|
|
50
50
|
this._lightsParamsv = [];
|
|
51
51
|
this._lightsParamsf = [];
|
|
52
52
|
this._lightsNames = [];
|
|
@@ -228,19 +228,28 @@ class RenderNode extends BaseNode {
|
|
|
228
228
|
transformLights() {
|
|
229
229
|
var r = this.renderer;
|
|
230
230
|
for (var i = 0; i < this._lights.length; i++) {
|
|
231
|
-
var ii = i *
|
|
231
|
+
var ii = i * 3;
|
|
232
232
|
var tp;
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
tp = r.activeCamera._viewMatrix.mulVec3(this._lights[i]._position);
|
|
238
|
-
this._lightsTransformedPositions[ii + 3] = 1;
|
|
239
|
-
}
|
|
240
|
-
this._lightsTransformedPositions[ii] = tp.x;
|
|
241
|
-
this._lightsTransformedPositions[ii + 1] = tp.y;
|
|
242
|
-
this._lightsTransformedPositions[ii + 2] = tp.z;
|
|
233
|
+
tp = this._lights[i]._position;
|
|
234
|
+
this._lightsPositions[ii] = tp.x;
|
|
235
|
+
this._lightsPositions[ii + 1] = tp.y;
|
|
236
|
+
this._lightsPositions[ii + 2] = tp.z;
|
|
243
237
|
}
|
|
238
|
+
|
|
239
|
+
// for (var i = 0; i < this._lights.length; i++) {
|
|
240
|
+
// var ii = i * 4;
|
|
241
|
+
// var tp;
|
|
242
|
+
// if (this._lights[i].directional) {
|
|
243
|
+
// tp = r.activeCamera._normalMatrix.mulVec(this._lights[i]._position);
|
|
244
|
+
// this._lightsTransformedPositions[ii + 3] = 0;
|
|
245
|
+
// } else {
|
|
246
|
+
// tp = r.activeCamera._viewMatrix.mulVec3(this._lights[i]._position);
|
|
247
|
+
// this._lightsTransformedPositions[ii + 3] = 1;
|
|
248
|
+
// }
|
|
249
|
+
// this._lightsTransformedPositions[ii] = tp.x;
|
|
250
|
+
// this._lightsTransformedPositions[ii + 1] = tp.y;
|
|
251
|
+
// this._lightsTransformedPositions[ii + 2] = tp.z;
|
|
252
|
+
// }
|
|
244
253
|
}
|
|
245
254
|
|
|
246
255
|
updateBillboardsTexCoords() {
|
|
@@ -249,6 +258,12 @@ class RenderNode extends BaseNode {
|
|
|
249
258
|
}
|
|
250
259
|
}
|
|
251
260
|
|
|
261
|
+
updateGeoObjectsTexCoords() {
|
|
262
|
+
for (var i = 0; i < this.entityCollections.length; i++) {
|
|
263
|
+
this.entityCollections[i].geoObjectHandler.refreshTexCoordsArr();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
252
267
|
/**
|
|
253
268
|
* @private
|
|
254
269
|
*/
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { Program } from '../webgl/Program.js';
|
|
4
|
+
import { UTILS } from './utils.js';
|
|
5
|
+
|
|
6
|
+
export const COMMON =
|
|
7
|
+
`
|
|
8
|
+
|
|
9
|
+
${UTILS}
|
|
10
|
+
|
|
11
|
+
#define PI 3.1415926538
|
|
12
|
+
#define ATMOS_HEIGHT 100000.0
|
|
13
|
+
#define RAYLEIGH_SCALE 0.08
|
|
14
|
+
#define MIE_SCALE 0.012
|
|
15
|
+
|
|
16
|
+
#define SAMPLE_COUNT 16
|
|
17
|
+
#define SQRT_SAMPLE_COUNT 4
|
|
18
|
+
|
|
19
|
+
const float GROUND_ALBEDO = 0.05 / PI;
|
|
20
|
+
|
|
21
|
+
// Sphere
|
|
22
|
+
const float BOTTOM_RADIUS = 6356752.3142451793;
|
|
23
|
+
const float TOP_RADIUS = 6356752.3142451793 + ATMOS_HEIGHT;
|
|
24
|
+
|
|
25
|
+
// Ellipsoid
|
|
26
|
+
const vec3 bottomRadii = vec3(6378137.0, 6356752.3142451793, 6378137.0);
|
|
27
|
+
const vec3 topRadii = bottomRadii + ATMOS_HEIGHT;
|
|
28
|
+
|
|
29
|
+
const vec3 SPHERE_TO_ELLIPSOID_SCALE = vec3(BOTTOM_RADIUS) / bottomRadii;
|
|
30
|
+
|
|
31
|
+
const vec2 rayleighMieHeights = vec2(RAYLEIGH_SCALE, MIE_SCALE) * ATMOS_HEIGHT;
|
|
32
|
+
|
|
33
|
+
const vec3 rayleighScatteringCoefficient = vec3(5.802, 13.558, 33.100) * 1e-6;
|
|
34
|
+
|
|
35
|
+
const float mieScatteringCoefficient = 3.996e-06;
|
|
36
|
+
const float mieExtinctionCoefficient = 4.440e-06;
|
|
37
|
+
const vec3 ozoneAbsorptionCoefficient = vec3(0.650, 1.881, 0.085) * 1e-6;
|
|
38
|
+
|
|
39
|
+
const float SUN_ANGULAR_RADIUS = 0.004685;
|
|
40
|
+
const float SUN_INTENSITY = 1.0;
|
|
41
|
+
|
|
42
|
+
vec3 sunWithBloom(vec3 rayDir, vec3 sunDir)
|
|
43
|
+
{
|
|
44
|
+
float minSunCosTheta = cos(SUN_ANGULAR_RADIUS);
|
|
45
|
+
float cosTheta = dot(rayDir, sunDir);
|
|
46
|
+
if (cosTheta >= minSunCosTheta) return vec3(1.0);
|
|
47
|
+
float offset = minSunCosTheta - cosTheta;
|
|
48
|
+
float gaussianBloom = exp(-offset*15000.0)*0.7;
|
|
49
|
+
float invBloom = 1.0/(0.09 + offset*200.0)*0.01;
|
|
50
|
+
return vec3(gaussianBloom + invBloom);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
float rayleighPhase(float angle)
|
|
54
|
+
{
|
|
55
|
+
return 3.0 / (16.0 * PI) * (1.0 + (angle * angle));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
float miePhase(float angle)
|
|
59
|
+
{
|
|
60
|
+
float g = 0.8;
|
|
61
|
+
return 3.0 / (8.0 * PI) * ((1.0 - g * g) * (1.0 + angle * angle)) / ((2.0 + g * g) * pow(1.0 + g * g - 2.0 * g * angle, 1.5));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
vec3 opticalDepth(float height, float angle)
|
|
65
|
+
{
|
|
66
|
+
vec3 rayOrigin = vec3(0.0, BOTTOM_RADIUS + height, 0.0);
|
|
67
|
+
vec3 rayDirection = vec3(sqrt(1.0 - angle * angle), angle, 0.0);
|
|
68
|
+
float t1, t2;
|
|
69
|
+
intersectSphere(rayOrigin, rayDirection, TOP_RADIUS, t1, t2);
|
|
70
|
+
float segmentLength = t2 / float(SAMPLE_COUNT);
|
|
71
|
+
|
|
72
|
+
float t = segmentLength * 0.5;
|
|
73
|
+
vec3 opticalDepth = vec3(0.0);
|
|
74
|
+
|
|
75
|
+
for (int i = 0; i < SAMPLE_COUNT; i++)
|
|
76
|
+
{
|
|
77
|
+
vec3 position = rayOrigin + t * rayDirection;
|
|
78
|
+
float height = length(position) - BOTTOM_RADIUS;
|
|
79
|
+
opticalDepth.xy += exp(-height / rayleighMieHeights) * segmentLength;
|
|
80
|
+
|
|
81
|
+
// density of the ozone layer is modeled as a triangular
|
|
82
|
+
// function that is 30 km wide and centered at 25 km altitude
|
|
83
|
+
opticalDepth.z += (1.0 - min(abs(height - 25e3) / 15e3, 1.0)) * segmentLength;
|
|
84
|
+
t += segmentLength;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return opticalDepth;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
vec3 transmittance(float height, float angle)
|
|
91
|
+
{
|
|
92
|
+
vec3 opticalDepth = opticalDepth(height, angle);
|
|
93
|
+
return exp(-(rayleighScatteringCoefficient * opticalDepth.x + mieExtinctionCoefficient * opticalDepth.y + ozoneAbsorptionCoefficient * opticalDepth.z));
|
|
94
|
+
}`;
|
|
95
|
+
|
|
96
|
+
export function transmittance() {
|
|
97
|
+
return new Program("transmittance", {
|
|
98
|
+
uniforms: {
|
|
99
|
+
iResolution: "vec2"
|
|
100
|
+
},
|
|
101
|
+
attributes: {
|
|
102
|
+
a_position: "vec2"
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
vertexShader:
|
|
106
|
+
`
|
|
107
|
+
attribute vec2 a_position;
|
|
108
|
+
|
|
109
|
+
void main(void)
|
|
110
|
+
{
|
|
111
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
112
|
+
}`,
|
|
113
|
+
|
|
114
|
+
fragmentShader:
|
|
115
|
+
`
|
|
116
|
+
precision highp float;
|
|
117
|
+
|
|
118
|
+
${COMMON}
|
|
119
|
+
|
|
120
|
+
uniform vec2 iResolution;
|
|
121
|
+
|
|
122
|
+
void main(void)
|
|
123
|
+
{
|
|
124
|
+
vec2 uv = gl_FragCoord.xy / iResolution.xy;
|
|
125
|
+
float height = uv.y * ATMOS_HEIGHT;
|
|
126
|
+
float angle = uv.x * 2.0 - 1.0;
|
|
127
|
+
gl_FragColor = vec4(transmittance(height, angle), 1.0);
|
|
128
|
+
}`
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function scattering() {
|
|
133
|
+
return new Program("scattering", {
|
|
134
|
+
uniforms: {
|
|
135
|
+
iResolution: "vec2",
|
|
136
|
+
transmittanceTexture: "sampler2d"
|
|
137
|
+
},
|
|
138
|
+
attributes: {
|
|
139
|
+
a_position: "vec2"
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
vertexShader:
|
|
143
|
+
`
|
|
144
|
+
attribute vec2 a_position;
|
|
145
|
+
|
|
146
|
+
void main(void)
|
|
147
|
+
{
|
|
148
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
149
|
+
}`,
|
|
150
|
+
|
|
151
|
+
fragmentShader:
|
|
152
|
+
`
|
|
153
|
+
precision highp float;
|
|
154
|
+
|
|
155
|
+
uniform sampler2D transmittanceTexture;
|
|
156
|
+
uniform vec2 iResolution;
|
|
157
|
+
|
|
158
|
+
${COMMON}
|
|
159
|
+
|
|
160
|
+
vec3 transmittanceFromTexture(float height, float angle)
|
|
161
|
+
{
|
|
162
|
+
float u = (angle + 1.0) * 0.5;
|
|
163
|
+
float v = height / ATMOS_HEIGHT;
|
|
164
|
+
return texture2D(transmittanceTexture, vec2(u, v)).xyz;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
void main(void)
|
|
168
|
+
{
|
|
169
|
+
vec2 uv = gl_FragCoord.xy / iResolution.xy;
|
|
170
|
+
|
|
171
|
+
float height = uv.y * ATMOS_HEIGHT;
|
|
172
|
+
float angle = uv.x * 2.0 - 1.0;
|
|
173
|
+
|
|
174
|
+
vec3 rayOrigin = vec3(0.0, BOTTOM_RADIUS + height, 0.0);
|
|
175
|
+
vec3 up = rayOrigin / length(rayOrigin);
|
|
176
|
+
vec3 lightDirection = vec3(sqrt(1.0 - angle * angle), angle, 0.0);
|
|
177
|
+
|
|
178
|
+
const float isotropicPhase = 1.0 / (4.0 * PI);
|
|
179
|
+
|
|
180
|
+
vec3 light = vec3(0.0);
|
|
181
|
+
vec3 lightTransferFactor = vec3(0.0);
|
|
182
|
+
|
|
183
|
+
for (int i = 0; i < SQRT_SAMPLE_COUNT; i++)
|
|
184
|
+
{
|
|
185
|
+
for (int j = 0; j < SQRT_SAMPLE_COUNT; j++)
|
|
186
|
+
{
|
|
187
|
+
float u = ((0.5 + float(i)) / float(SQRT_SAMPLE_COUNT)) * 2.0 - 1.0;
|
|
188
|
+
float v = (0.5 + float(j)) / float(SQRT_SAMPLE_COUNT);
|
|
189
|
+
float r = sqrt(1.0 - u * u);
|
|
190
|
+
float theta = 2.0 * PI * v;
|
|
191
|
+
vec3 rayDirection = vec3(cos(theta) * r, sin(theta) * r, u);
|
|
192
|
+
|
|
193
|
+
float rayAngle = dot(up, rayDirection);
|
|
194
|
+
bool cameraBelow = rayAngle < 0.0;
|
|
195
|
+
|
|
196
|
+
vec3 transmittanceFromCameraToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);
|
|
197
|
+
|
|
198
|
+
float offset = 0.0;
|
|
199
|
+
float distanceToSpace = 0.0;
|
|
200
|
+
|
|
201
|
+
intersectSphere(rayOrigin, rayDirection, TOP_RADIUS, offset, distanceToSpace);
|
|
202
|
+
|
|
203
|
+
float distanceToGround = 0.0;
|
|
204
|
+
bool hitGround = intersectSphere(rayOrigin, rayDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround > 0.0;
|
|
205
|
+
float segmentLength = (hitGround ? distanceToGround : distanceToSpace) / float(SAMPLE_COUNT);
|
|
206
|
+
float t = segmentLength * 0.5;
|
|
207
|
+
|
|
208
|
+
vec3 transmittanceCamera;
|
|
209
|
+
vec3 transmittanceLight;
|
|
210
|
+
|
|
211
|
+
for (int k = 0; k < SAMPLE_COUNT; k++)
|
|
212
|
+
{
|
|
213
|
+
vec3 position = rayOrigin + t * rayDirection;
|
|
214
|
+
float height = length(position) - BOTTOM_RADIUS;
|
|
215
|
+
vec3 up = position / length(position);
|
|
216
|
+
float rayAngle = dot(up, rayDirection);
|
|
217
|
+
float lightAngle = dot(up, lightDirection);
|
|
218
|
+
|
|
219
|
+
float distanceToGround;
|
|
220
|
+
float shadow = intersectSphere(position, lightDirection, BOTTOM_RADIUS, distanceToGround) && distanceToGround >= 0.0 ? 0.0 : 1.0;
|
|
221
|
+
vec3 transmittanceToSpace = transmittanceFromTexture(height, cameraBelow ? -rayAngle : rayAngle);
|
|
222
|
+
|
|
223
|
+
transmittanceCamera = cameraBelow ? (transmittanceToSpace / transmittanceFromCameraToSpace) : (transmittanceFromCameraToSpace / transmittanceToSpace);
|
|
224
|
+
transmittanceLight = transmittanceFromTexture(height, lightAngle);
|
|
225
|
+
|
|
226
|
+
vec2 opticalDensity = exp(-height / rayleighMieHeights);
|
|
227
|
+
vec3 scatteredLight = transmittanceLight * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y) * isotropicPhase;
|
|
228
|
+
|
|
229
|
+
light += shadow * transmittanceCamera * scatteredLight * segmentLength;
|
|
230
|
+
lightTransferFactor += transmittanceCamera * (rayleighScatteringCoefficient * opticalDensity.x + mieScatteringCoefficient * opticalDensity.y) * segmentLength;
|
|
231
|
+
|
|
232
|
+
t += segmentLength;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (hitGround)
|
|
236
|
+
{
|
|
237
|
+
vec3 hitPoint = rayOrigin + rayDirection * distanceToGround;
|
|
238
|
+
vec3 normal = normalize(hitPoint);
|
|
239
|
+
float diffuseAngle = max(dot(normal, lightDirection), 0.0);
|
|
240
|
+
float earthAlbedo = 0.05;
|
|
241
|
+
light += transmittanceCamera * transmittanceLight * (earthAlbedo / PI) * diffuseAngle;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
light /= float(SAMPLE_COUNT);
|
|
247
|
+
lightTransferFactor /= float(SAMPLE_COUNT);
|
|
248
|
+
vec3 color = light / (1.0 - lightTransferFactor);
|
|
249
|
+
gl_FragColor = vec4(color, 1.0);
|
|
250
|
+
}`
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// const vec3 solar_irradiance = vec3(1.474000,1.850400,1.911980);
|
|
255
|
+
// float GetTextureCoordFromUnitRange(float x, int texture_size) {
|
|
256
|
+
// return 0.5 / float(texture_size) + x * (1.0 - 1.0 / float(texture_size));
|
|
257
|
+
// }
|
|
258
|
+
//
|
|
259
|
+
// float ClampDistance(float d) {
|
|
260
|
+
// return max(d, 0.0 * m);
|
|
261
|
+
// }
|
|
262
|
+
//
|
|
263
|
+
// float SafeSqrt(float a) {
|
|
264
|
+
// return sqrt(max(a, 0.0 * m2));
|
|
265
|
+
// }
|
|
266
|
+
|
|
267
|
+
// float DistanceToTopAtmosphereBoundary(float r, float mu) {
|
|
268
|
+
//
|
|
269
|
+
// //assert(r <= atmosphere.top_radius);
|
|
270
|
+
// //assert(mu >= -1.0 && mu <= 1.0);
|
|
271
|
+
//
|
|
272
|
+
// float discriminant = r * r * (mu * mu - 1.0) + TOP_RADIUS * TOP_RADIUS;
|
|
273
|
+
// return ClampDistance(-r * mu + SafeSqrt(discriminant));
|
|
274
|
+
// }
|
|
275
|
+
|
|
276
|
+
// vec2 GetTransmittanceTextureUvFromRMu(
|
|
277
|
+
// float r,
|
|
278
|
+
// float mu)
|
|
279
|
+
// {
|
|
280
|
+
// //assert(r >= atmosphere.BOTTOM_RADIUS && r <= TOP_RADIUS);
|
|
281
|
+
// //assert(mu >= -1.0 && mu <= 1.0);
|
|
282
|
+
//
|
|
283
|
+
// float H = sqrt(TOP_RADIUS * TOP_RADIUS - BOTTOM_RADIUS * BOTTOM_RADIUS);
|
|
284
|
+
// float rho = SafeSqrt(r * r - BOTTOM_RADIUS * BOTTOM_RADIUS);
|
|
285
|
+
// float d = DistanceToTopAtmosphereBoundary(r, mu);
|
|
286
|
+
// float d_min = TOP_RADIUS - r;
|
|
287
|
+
// float d_max = rho + H;
|
|
288
|
+
// float x_mu = (d - d_min) / (d_max - d_min);
|
|
289
|
+
// float x_r = rho / H;
|
|
290
|
+
//
|
|
291
|
+
// return vec2(
|
|
292
|
+
// GetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH),
|
|
293
|
+
// GetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT)
|
|
294
|
+
// );
|
|
295
|
+
// }
|
|
296
|
+
|
|
297
|
+
// vec3 GetTransmittanceToTopAtmosphereBoundary(in sampler2D transmittance_texture, float r, float mu)
|
|
298
|
+
// {
|
|
299
|
+
// //assert(r >= BOTTOM_RADIUS && r <= TOP_RADIUS);
|
|
300
|
+
//
|
|
301
|
+
// vec2 uv = GetTransmittanceTextureUvFromRMu(r, mu);
|
|
302
|
+
// return texture(transmittance_texture, uv).xyz;
|
|
303
|
+
// }
|
|
304
|
+
|
|
305
|
+
// vec3 GetTransmittanceToSun(
|
|
306
|
+
// in sampler2D transmittance_texture,
|
|
307
|
+
// float r,
|
|
308
|
+
// float mu_s)
|
|
309
|
+
// {
|
|
310
|
+
// float sin_theta_h = BOTTOM_RADIUS / r;
|
|
311
|
+
// float cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0));
|
|
312
|
+
//
|
|
313
|
+
// return GetTransmittanceToTopAtmosphereBoundary(transmittance_texture, r, mu_s) * smoothstep(
|
|
314
|
+
// -sin_theta_h * SUN_ANGULAR_RADIUS / rad, sin_theta_h * SUN_ANGULAR_RADIUS / rad,
|
|
315
|
+
// mu_s - cos_theta_h
|
|
316
|
+
// );
|
|
317
|
+
// }
|
|
318
|
+
|
|
319
|
+
// vec3 GetSunAndSkyIrradiance(
|
|
320
|
+
// in sampler2D transmittance_texture,
|
|
321
|
+
// in vec3 point,
|
|
322
|
+
// in vec3 normal,
|
|
323
|
+
// in vec3 sun_direction,
|
|
324
|
+
// out vec3 sky_irradiance)
|
|
325
|
+
// {
|
|
326
|
+
// float r = length(point);
|
|
327
|
+
// float mu_s = dot(point, sun_direction) / r;
|
|
328
|
+
//
|
|
329
|
+
// sky_irradiance = vec3(0.0); // GetIrradiance(atmosphere, irradiance_texture, r, mu_s) * (1.0 + dot(normal, point) / r) * 0.5;
|
|
330
|
+
//
|
|
331
|
+
// return solar_irradiance * GetTransmittanceToSun(transmittance_texture, r, mu_s) * max(dot(normal, sun_direction), 0.0);
|
|
332
|
+
// }
|