Skip to content

Commit

Permalink
Merge pull request #1 from verybigzhouhai/3dtile-dark01
Browse files Browse the repository at this point in the history
fix: 3dtile dark
  • Loading branch information
verybigzhouhai committed Jun 19, 2019
2 parents b2588e4 + 38bab88 commit f383685
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 26 deletions.
1 change: 1 addition & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,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)
4 changes: 2 additions & 2 deletions Source/Scene/processPbrMaterials.js
Original file line number Diff line number Diff line change
Expand Up @@ -740,9 +740,9 @@ 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 += ' vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);\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, ellipsoid_radii.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
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);
}
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
9 changes: 5 additions & 4 deletions Source/Shaders/DepthPlaneFS.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ 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;
vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);
vec3 ellipsoid_inverseRadii = vec3(1.0 / ellipsoid_radii.x, 1.0 / ellipsoid_radii.y, 1.0 / ellipsoid_radii.z);

czm_raySegment intersection = czm_rayEllipsoidIntersectionInterval(ray, ellipsoid_center, ellipsoid_inverseRadii);
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
10 changes: 6 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 = vec3(6378137.0, 6378137.0, 6356752.314245);
float maxRadii = max(radii.x, max(radii.y, radii.z));
fadeOutDist -= maxRadii;
fadeInDist -= maxRadii;
Expand Down Expand Up @@ -376,16 +376,18 @@ 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;
vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);
vec3 ellipsoid_inverseRadii = vec3(1.0 / ellipsoid_radii.x, 1.0 / ellipsoid_radii.y, 1.0 / ellipsoid_radii.z);

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

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

#ifdef APPLY_MATERIAL
float northPoleZ = czm_getWgs84EllipsoidEC().radii.z;
vec3 ellipsoid_radii = vec3(6378137.0, 6378137.0, 6356752.314245);
float northPoleZ = ellipsoid_radii.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 f383685

Please sign in to comment.