Skip to content

Commit d6f91aa

Browse files
ZhouhaiZhouhai
Zhouhai
authored and
Zhouhai
committed
Solve struct ellipsoid caused the model to dark
Solved the problem that struct ellipsoid caused the model to darken on Qualcomm platform
1 parent 28010cc commit d6f91aa

10 files changed

+42
-39
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 += ' czm_getWgs84EllipsoidEC();\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, czm_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/ellipsoidNew.glsl

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ czm_ellipsoid czm_ellipsoidNew(vec3 center, vec3 radii)
99
{
1010
vec3 inverseRadii = vec3(1.0 / radii.x, 1.0 / radii.y, 1.0 / radii.z);
1111
vec3 inverseRadiiSquared = inverseRadii * inverseRadii;
12-
czm_ellipsoid temp = czm_ellipsoid(center, radii, inverseRadii, inverseRadiiSquared);
13-
return temp;
12+
czm_ellipsoid_center = center;
13+
czm_ellipsoid_radii = radii;
14+
czm_ellipsoid_inverseRadii = inverseRadii;
15+
czm_ellipsoid_inverseRadiiSquared = inverseRadiiSquared;
1416
}

Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl

+6-4
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,20 @@
44
* @name czm_getWgs84EllipsoidEC
55
* @glslFunction
66
*
7-
* @returns {czm_ellipsoid} The WGS84 ellipsoid, with its center at the origin of world coordinates, in eye coordinates.
87
*
98
* @see Ellipsoid.WGS84
109
*
1110
* @example
12-
* czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
11+
* czm_getWgs84EllipsoidEC();
1312
*/
1413
czm_ellipsoid czm_getWgs84EllipsoidEC()
1514
{
1615
vec3 radii = vec3(6378137.0, 6378137.0, 6356752.314245);
1716
vec3 inverseRadii = vec3(1.0 / radii.x, 1.0 / radii.y, 1.0 / radii.z);
1817
vec3 inverseRadiiSquared = inverseRadii * inverseRadii;
19-
czm_ellipsoid temp = czm_ellipsoid(czm_view[3].xyz, radii, inverseRadii, inverseRadiiSquared);
20-
return temp;
18+
czm_ellipsoid_center = czm_view[3].xyz;
19+
czm_ellipsoid_radii = radii;
20+
czm_ellipsoid_inverseRadii = inverseRadii;
21+
czm_ellipsoid_inverseRadiiSquared = inverseRadiiSquared;
22+
2123
}

Source/Shaders/Builtin/Functions/rayEllipsoidIntersectionInterval.glsl

+11-11
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 center, vec3 inverseRadii)
88
{
9-
// 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-
9+
// ray and ellipsoid center in eye coordinates. radii in model coordinates.
10+
vec3 q = inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;
11+
vec3 w = inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;
12+
13+
q = q - inverseRadii * (czm_inverseModelView * vec4(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;
+8-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
/** DOC_TBA
2-
*
3-
* @name czm_ellipsoid
4-
* @glslStruct
5-
*/
6-
struct czm_ellipsoid
7-
{
8-
vec3 center;
9-
vec3 radii;
10-
vec3 inverseRadii;
11-
vec3 inverseRadiiSquared;
12-
};
1+
/**
2+
*
3+
struct ellipsoid
4+
*/
5+
vec3 czm_ellipsoid_center;
6+
vec3 czm_ellipsoid_radii;
7+
vec3 czm_ellipsoid_inverseRadii;
8+
vec3 czm_ellipsoid_inverseRadiiSquared;

Source/Shaders/DepthPlaneFS.glsl

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ varying vec4 positionEC;
33
void main()
44
{
55
// TODO: make arbitrary ellipsoid
6-
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
6+
czm_getWgs84EllipsoidEC();
77

88
vec3 direction = normalize(positionEC.xyz);
99
czm_ray ray = czm_ray(vec3(0.0), direction);
1010

11-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
11+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, czm_ellipsoid_center, czm_ellipsoid_inverseRadii);
1212
if (!czm_isEmpty(intersection))
1313
{
1414
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);

Source/Shaders/EllipsoidFS.glsl

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ void main()
7373

7474
// March ray forward to intersection with larger sphere and find
7575
// actual intersection point with ellipsoid.
76-
czm_ellipsoid ellipsoid = czm_ellipsoidNew(ellipsoidCenter, u_radii);
76+
czm_ellipsoidNew(ellipsoidCenter, u_radii);
7777
czm_ray ray = czm_ray(t * direction, direction);
78-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
78+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, czm_ellipsoid_center, czm_ellipsoid_inverseRadii);
7979

8080
if (czm_isEmpty(intersection))
8181
{

Source/Shaders/GlobeFS.glsl

+4-3
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,8 @@ 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+
czm_getWgs84EllipsoidEC();
282+
vec3 radii = czm_ellipsoid_radii;
282283
float maxRadii = max(radii.x, max(radii.y, radii.z));
283284
fadeOutDist -= maxRadii;
284285
fadeInDist -= maxRadii;
@@ -376,7 +377,7 @@ void main()
376377
}
377378

378379
#if defined(PER_FRAGMENT_GROUND_ATMOSPHERE) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING))
379-
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();
380+
czm_getWgs84EllipsoidEC();
380381

381382
float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0));
382383
vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0);
@@ -385,7 +386,7 @@ void main()
385386
vec3 direction = normalize(vec3(xy, -czm_currentFrustum.x));
386387
czm_ray ray = czm_ray(vec3(0.0), direction);
387388

388-
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
389+
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, czm_ellipsoid_center, czm_ellipsoid_inverseRadii);
389390

390391
vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start);
391392
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+
czm_getWgs84EllipsoidEC();
180+
float northPoleZ = czm_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)