Skip to content

Commit f383685

Browse files
Merge pull request #1 from verybigzhouhai/3dtile-dark01
fix: 3dtile dark
2 parents b2588e4 + 38bab88 commit f383685

8 files changed

+32
-26
lines changed

CONTRIBUTORS.md

+1
Original file line numberDiff line numberDiff line change
@@ -211,3 +211,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu
211211
* [Trubie Turner](https://github.com/flexei)
212212
* [Merijn Wijngaard](https://github.com/mwijngaard)
213213
* [Dennis Adams](https://github.com/dennisadams)
214+
* [Hai Zhou](https://github.com/verybigzhouhai)

Source/Scene/processPbrMaterials.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -740,9 +740,9 @@ define([
740740

741741
fragmentShader += ' vec3 r = normalize(czm_inverseViewRotation * normalize(reflect(v, n)));\n';
742742
// Figure out if the reflection vector hits the ellipsoid
743-
fragmentShader += ' czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n';
743+
fragmentShader += ' vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);\n';
744744
fragmentShader += ' float vertexRadius = length(positionWC);\n';
745-
fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, ellipsoid.radii.x / vertexRadius);\n';
745+
fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, ellipsoid_radii.x / vertexRadius);\n';
746746
fragmentShader += ' float reflectionDotNadir = dot(r, normalize(positionWC));\n';
747747
// Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z.
748748
fragmentShader += ' r.x = -r.x;\n';

Source/Shaders/Builtin/Functions/ellipsoidContainsPoint.glsl

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
* @glslFunction
66
*
77
*/
8-
bool czm_ellipsoidContainsPoint(czm_ellipsoid ellipsoid, vec3 point)
8+
bool czm_ellipsoidContainsPoint(vec3 ellipsoid_inverseRadii, vec3 point)
99
{
10-
vec3 scaled = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;
10+
vec3 scaled = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;
1111
return (dot(scaled, scaled) <= 1.0);
1212
}

Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl

+10-10
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
* @name czm_rayEllipsoidIntersectionInterval
55
* @glslFunction
66
*/
7-
czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid ellipsoid)
7+
czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii)
88
{
99
// ray and ellipsoid center in eye coordinates. radii in model coordinates.
10-
vec3 q = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;
11-
vec3 w = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;
12-
13-
q = q - ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ellipsoid.center, 1.0)).xyz;
14-
10+
vec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;
11+
vec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;
12+
13+
q = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz;
14+
1515
float q2 = dot(q, q);
1616
float qw = dot(q, w);
17-
17+
1818
if (q2 > 1.0) // Outside ellipsoid.
1919
{
2020
if (qw >= 0.0) // Looking outward or tangent (0 intersections).
@@ -27,11 +27,11 @@ czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid e
2727
float difference = q2 - 1.0; // Positively valued.
2828
float w2 = dot(w, w);
2929
float product = w2 * difference;
30-
30+
3131
if (qw2 < product) // Imaginary roots (0 intersections).
3232
{
33-
return czm_emptyRaySegment;
34-
}
33+
return czm_emptyRaySegment;
34+
}
3535
else if (qw2 > product) // Distinct roots (2 intersections).
3636
{
3737
float discriminant = qw * qw - product;

Source/Shaders/DepthPlaneFS.glsl

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ varying vec4 positionEC;
22

33
void main()
44
{
5-
// TODO: make arbitrary ellipsoid
6-
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
7-
85
vec3 direction = normalize(positionEC.xyz);
96
czm_ray ray = czm_ray(vec3(0.0), direction);
107

11-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
8+
vec3 ellipsoid_center = czm_view[3].xyz;
9+
vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);
10+
vec3 ellipsoid_inverseRadii = vec3(1.0 / ellipsoid_radii.x, 1.0 / ellipsoid_radii.y, 1.0 / ellipsoid_radii.z);
11+
12+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, ellipsoid_inverseRadii);
1213
if (!czm_isEmpty(intersection))
1314
{
1415
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);

Source/Shaders/EllipsoidFS.glsl

+4-3
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,11 @@ void main()
7272
}
7373

7474
// March ray forward to intersection with larger sphere and find
75-
// actual intersection point with ellipsoid.
76-
czm_ellipsoid ellipsoid = czm_ellipsoidNew(ellipsoidCenter, u_radii);
7775
czm_ray ray = czm_ray(t * direction, direction);
78-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
76+
77+
vec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z);
78+
79+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii);
7980

8081
if (czm_isEmpty(intersection))
8182
{

Source/Shaders/GlobeFS.glsl

+6-4
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ void main()
278278
float fadeOutDist = u_lightingFadeDistance.x;
279279
float fadeInDist = u_lightingFadeDistance.y;
280280
if (czm_sceneMode != czm_sceneMode3D) {
281-
vec3 radii = czm_getWgs84EllipsoidEC().radii;
281+
vec3 radii = vec3(6378137.0, 6378137.0, 6356752.314245);
282282
float maxRadii = max(radii.x, max(radii.y, radii.z));
283283
fadeOutDist -= maxRadii;
284284
fadeInDist -= maxRadii;
@@ -376,16 +376,18 @@ void main()
376376
}
377377

378378
#if defined(PER_FRAGMENT_GROUND_ATMOSPHERE) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING))
379-
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
380-
381379
float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0));
382380
vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0);
383381
xy *= czm_viewport.zw * mpp * 0.5;
384382

385383
vec3 direction = normalize(vec3(xy, -czm_currentFrustum.x));
386384
czm_ray ray = czm_ray(vec3(0.0), direction);
387385

388-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
386+
vec3 ellipsoid_center = czm_view[3].xyz;
387+
vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);
388+
vec3 ellipsoid_inverseRadii = vec3(1.0 / ellipsoid_radii.x, 1.0 / ellipsoid_radii.y, 1.0 / ellipsoid_radii.z);
389+
390+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, ellipsoid_inverseRadii);
389391

390392
vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start);
391393
ellipsoidPosition = (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz;

Source/Shaders/GlobeVS.glsl

+2-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ void main()
176176
#endif
177177

178178
#ifdef APPLY_MATERIAL
179-
float northPoleZ = czm_getWgs84EllipsoidEC().radii.z;
179+
vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);
180+
float northPoleZ = ellipsoid_radii.z;
180181
vec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ);
181182
vec3 ellipsoidNormal = normalize(v_positionMC); // For a sphere this is correct, but not generally for an ellipsoid.
182183
vec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal));

0 commit comments

Comments
 (0)