Skip to content

Commit

Permalink
Merge pull request #7944 from verybigzhouhai/3dtile-dark
Browse files Browse the repository at this point in the history
Solve struct ellipsoid caused the model to dark
  • Loading branch information
Omar Shehata authored Jun 28, 2019
2 parents eefaa42 + f9d5f53 commit 32cb311
Show file tree
Hide file tree
Showing 14 changed files with 41 additions and 73 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Change Log
* Fixed polyline colors when `scene.highDynamicRange` is enabled. [#7924](https://github.com/AnalyticalGraphicsInc/cesium/pull/7924)
* Fixed a bug in the inspector where the min/max height values of a picked tile were undefined. [#7904](https://github.com/AnalyticalGraphicsInc/cesium/pull/7904)
* Fixed `Math.factorial` to return the correct values. (https://github.com/AnalyticalGraphicsInc/cesium/pull/7969)
* Fixed a bug that caused 3D models to appear darker on Android devices. [#7944](https://github.com/AnalyticalGraphicsInc/cesium/pull/7944)

### 1.58.1 - 2018-06-03
_This is an npm-only release to fix a publishing issue_.
Expand Down
1 change: 1 addition & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,3 +214,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu
* [Trubie Turner](https://github.com/flexei)
* [Merijn Wijngaard](https://github.com/mwijngaard)
* [Dennis Adams](https://github.com/dennisadams)
* [Hai Zhou](https://github.com/verybigzhouhai)
3 changes: 1 addition & 2 deletions Source/Scene/processPbrMaterials.js
Original file line number Diff line number Diff line change
Expand Up @@ -740,9 +740,8 @@ define([

fragmentShader += ' vec3 r = normalize(czm_inverseViewRotation * normalize(reflect(v, n)));\n';
// Figure out if the reflection vector hits the ellipsoid
fragmentShader += ' czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();\n';
fragmentShader += ' float vertexRadius = length(positionWC);\n';
fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, ellipsoid.radii.x / vertexRadius);\n';
fragmentShader += ' float horizonDotNadir = 1.0 - min(1.0, czm_ellipsoidRadii.x / vertexRadius);\n';
fragmentShader += ' float reflectionDotNadir = dot(r, normalize(positionWC));\n';
// Flipping the X vector is a cheap way to get the inverse of czm_temeToPseudoFixed, since that's a rotation about Z.
fragmentShader += ' r.x = -r.x;\n';
Expand Down
7 changes: 7 additions & 0 deletions Source/Shaders/Builtin/Constants/ellipsoidInverseRadii.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* The reciprocal of the radius of the WGS84 ellipsoid.
*
* @name czm_ellipsoidInverseRadii
* @glslConstant
*/
const vec3 czm_ellipsoidInverseRadii = vec3(1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.314245);
7 changes: 7 additions & 0 deletions Source/Shaders/Builtin/Constants/ellipsoidRadii.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/**
* The radius of the WGS84 ellipsoid.
*
* @name czm_ellipsoidRadii
* @glslConstant
*/
const vec3 czm_ellipsoidRadii = vec3(6378137.0, 6378137.0, 6356752.314245);
4 changes: 2 additions & 2 deletions Source/Shaders/Builtin/Functions/ellipsoidContainsPoint.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
* @glslFunction
*
*/
bool czm_ellipsoidContainsPoint(czm_ellipsoid ellipsoid, vec3 point)
bool czm_ellipsoidContainsPoint(vec3 ellipsoid_inverseRadii, vec3 point)
{
vec3 scaled = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;
vec3 scaled = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(point, 1.0)).xyz;
return (dot(scaled, scaled) <= 1.0);
}
14 changes: 0 additions & 14 deletions Source/Shaders/Builtin/Functions/ellipsoidNew.glsl

This file was deleted.

21 changes: 0 additions & 21 deletions Source/Shaders/Builtin/Functions/getWgs84EllipsoidEC.glsl

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
* @name czm_rayEllipsoidIntersectionInterval
* @glslFunction
*/
czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid ellipsoid)
czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, vec3 ellipsoid_center, vec3 ellipsoid_inverseRadii)
{
// ray and ellipsoid center in eye coordinates. radii in model coordinates.
vec3 q = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;
vec3 w = ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;
q = q - ellipsoid.inverseRadii * (czm_inverseModelView * vec4(ellipsoid.center, 1.0)).xyz;
vec3 q = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.origin, 1.0)).xyz;
vec3 w = ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ray.direction, 0.0)).xyz;

q = q - ellipsoid_inverseRadii * (czm_inverseModelView * vec4(ellipsoid_center, 1.0)).xyz;

float q2 = dot(q, q);
float qw = dot(q, w);

if (q2 > 1.0) // Outside ellipsoid.
{
if (qw >= 0.0) // Looking outward or tangent (0 intersections).
Expand All @@ -27,11 +27,11 @@ czm_raySegment czm_rayEllipsoidIntersectionInterval(czm_ray ray, czm_ellipsoid e
float difference = q2 - 1.0; // Positively valued.
float w2 = dot(w, w);
float product = w2 * difference;

if (qw2 < product) // Imaginary roots (0 intersections).
{
return czm_emptyRaySegment;
}
return czm_emptyRaySegment;
}
else if (qw2 > product) // Distinct roots (2 intersections).
{
float discriminant = qw * qw - product;
Expand Down
12 changes: 0 additions & 12 deletions Source/Shaders/Builtin/Structs/ellipsoid.glsl

This file was deleted.

7 changes: 3 additions & 4 deletions Source/Shaders/DepthPlaneFS.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@ varying vec4 positionEC;

void main()
{
// TODO: make arbitrary ellipsoid
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();

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

czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
vec3 ellipsoid_center = czm_view[3].xyz;

czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii);
if (!czm_isEmpty(intersection))
{
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
Expand Down
7 changes: 4 additions & 3 deletions Source/Shaders/EllipsoidFS.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,11 @@ void main()
}

// March ray forward to intersection with larger sphere and find
// actual intersection point with ellipsoid.
czm_ellipsoid ellipsoid = czm_ellipsoidNew(ellipsoidCenter, u_radii);
czm_ray ray = czm_ray(t * direction, direction);
czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);

vec3 ellipsoid_inverseRadii = vec3(1.0 / u_radii.x, 1.0 / u_radii.y, 1.0 / u_radii.z);

czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoidCenter, ellipsoid_inverseRadii);

if (czm_isEmpty(intersection))
{
Expand Down
8 changes: 4 additions & 4 deletions Source/Shaders/GlobeFS.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ void main()
float fadeOutDist = u_lightingFadeDistance.x;
float fadeInDist = u_lightingFadeDistance.y;
if (czm_sceneMode != czm_sceneMode3D) {
vec3 radii = czm_getWgs84EllipsoidEC().radii;
vec3 radii = czm_ellipsoidRadii;
float maxRadii = max(radii.x, max(radii.y, radii.z));
fadeOutDist -= maxRadii;
fadeInDist -= maxRadii;
Expand Down Expand Up @@ -376,16 +376,16 @@ void main()
}

#if defined(PER_FRAGMENT_GROUND_ATMOSPHERE) && (defined(ENABLE_DAYNIGHT_SHADING) || defined(ENABLE_VERTEX_LIGHTING))
czm_ellipsoid ellipsoid = czm_getWgs84EllipsoidEC();

float mpp = czm_metersPerPixel(vec4(0.0, 0.0, -czm_currentFrustum.x, 1.0));
vec2 xy = gl_FragCoord.xy / czm_viewport.zw * 2.0 - vec2(1.0);
xy *= czm_viewport.zw * mpp * 0.5;

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

czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid);
vec3 ellipsoid_center = czm_view[3].xyz;

czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, czm_ellipsoidInverseRadii);

vec3 ellipsoidPosition = czm_pointAlongRay(ray, intersection.start);
ellipsoidPosition = (czm_inverseView * vec4(ellipsoidPosition, 1.0)).xyz;
Expand Down
2 changes: 1 addition & 1 deletion Source/Shaders/GlobeVS.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ void main()
#endif

#ifdef APPLY_MATERIAL
float northPoleZ = czm_getWgs84EllipsoidEC().radii.z;
float northPoleZ = czm_ellipsoidRadii.z;
vec3 northPolePositionMC = vec3(0.0, 0.0, northPoleZ);
vec3 ellipsoidNormal = normalize(v_positionMC); // For a sphere this is correct, but not generally for an ellipsoid.
vec3 vectorEastMC = normalize(cross(northPolePositionMC - v_positionMC, ellipsoidNormal));
Expand Down

0 comments on commit 32cb311

Please sign in to comment.