|
@@ -3,29 +3,74 @@ export default /* glsl */`
|
|
|
|
|
|
vec4 plane;
|
|
vec4 plane;
|
|
|
|
|
|
- #pragma unroll_loop_start
|
|
|
|
- for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {
|
|
|
|
|
|
+ #ifdef ALPHA_TO_COVERAGE
|
|
|
|
|
|
- plane = clippingPlanes[ i ];
|
|
|
|
- if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;
|
|
|
|
|
|
+ float distanceToPlane, distanceGradient;
|
|
|
|
+ float clipOpacity = 1.0;
|
|
|
|
|
|
- }
|
|
|
|
- #pragma unroll_loop_end
|
|
|
|
|
|
+ #pragma unroll_loop_start
|
|
|
|
+ for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {
|
|
|
|
+
|
|
|
|
+ plane = clippingPlanes[ i ];
|
|
|
|
+ distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;
|
|
|
|
+ distanceGradient = fwidth( distanceToPlane ) / 2.0;
|
|
|
|
+ clipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );
|
|
|
|
+
|
|
|
|
+ if ( clipOpacity == 0.0 ) discard;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ #pragma unroll_loop_end
|
|
|
|
+
|
|
|
|
+ #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
|
|
|
|
+
|
|
|
|
+ float unionClipOpacity = 1.0;
|
|
|
|
+
|
|
|
|
+ #pragma unroll_loop_start
|
|
|
|
+ for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
|
|
|
|
+
|
|
|
|
+ plane = clippingPlanes[ i ];
|
|
|
|
+ distanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;
|
|
|
|
+ distanceGradient = fwidth( distanceToPlane ) / 2.0;
|
|
|
|
+ unionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );
|
|
|
|
|
|
- #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
|
|
|
|
|
|
+ }
|
|
|
|
+ #pragma unroll_loop_end
|
|
|
|
|
|
- bool clipped = true;
|
|
|
|
|
|
+ clipOpacity *= 1.0 - unionClipOpacity;
|
|
|
|
+
|
|
|
|
+ #endif
|
|
|
|
+
|
|
|
|
+ diffuseColor.a *= clipOpacity;
|
|
|
|
+
|
|
|
|
+ if ( diffuseColor.a == 0.0 ) discard;
|
|
|
|
+
|
|
|
|
+ #else
|
|
|
|
|
|
#pragma unroll_loop_start
|
|
#pragma unroll_loop_start
|
|
- for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
|
|
|
|
|
|
+ for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {
|
|
|
|
|
|
plane = clippingPlanes[ i ];
|
|
plane = clippingPlanes[ i ];
|
|
- clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;
|
|
|
|
|
|
+ if ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;
|
|
|
|
|
|
}
|
|
}
|
|
#pragma unroll_loop_end
|
|
#pragma unroll_loop_end
|
|
|
|
|
|
- if ( clipped ) discard;
|
|
|
|
|
|
+ #if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
|
|
|
|
+
|
|
|
|
+ bool clipped = true;
|
|
|
|
+
|
|
|
|
+ #pragma unroll_loop_start
|
|
|
|
+ for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
|
|
|
|
+
|
|
|
|
+ plane = clippingPlanes[ i ];
|
|
|
|
+ clipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ #pragma unroll_loop_end
|
|
|
|
+
|
|
|
|
+ if ( clipped ) discard;
|
|
|
|
+
|
|
|
|
+ #endif
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|