Search code examples
three.jsopengl-es-2.0webglfragment-shadervertex-shader

glClipPlane - Is there an equivalent in webGL?


I have a 3D mesh. Is there any possibility to render the sectional view (clipping) like glClipPlane in OpenGL?

I am using Three.js r65.

The latest shader that I have added is:
Fragment Shader:

uniform float time;
uniform vec2 resolution; 
varying vec2 vUv; 
void main( void ) 
{ 
vec2 position = -1.0 + 2.0 * vUv; 
float red = abs( sin( position.x * position.y + time / 2.0 ) ); 
float green = abs( cos( position.x * position.y + time / 3.0 ) ); 
float blue = abs( cos( position.x * position.y + time / 4.0 ) ); 
if(position.x > 0.2  && position.y > 0.2 ) 
{  
discard; 
 } 
gl_FragColor = vec4( red, green, blue, 1.0 ); }


Vertex Shader:

varying vec2 vUv;
void main() 
{ 
vUv = uv;
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); 
gl_Position = projectionMatrix * mvPosition; 
}

Solution

  • In the newer versions (> r.76) of three.js clipping is supported in the THREE.WebGLRenderer. There is an array property called clippingPlanes where you can add your custom clipping planes (THREE.Plane instances).

    For three.js you can check these two examples:

    1) WebGL clipping (code base here on GitHub)

    2) WebGL clipping advanced (code base here on GitHub)


    A simple example

    To add a clipping plane to the renderer you can do:

    var normal = new THREE.Vector3( -1, 0, 0 );
    var constant = 0;
    var plane = new THREE.Plane( normal, constant );
    renderer.clippingPlanes = [plane];
    

    Here a fiddle to demonstrate this.


    You can also clip on object level by adding a clipping plane to the object material. For this to work you have to set the renderer localClippingEnabled property to true.

    // set renderer
    renderer.localClippingEnabled = true;
    
    // add clipping plane to material
    var normal = new THREE.Vector3( -1, 0, 0 );
    var constant = 0;
    var color = 0xff0000;
    var plane = new THREE.Plane( normal, constant );
    var material = new THREE.MeshBasicMaterial({ color: color });
    material.clippingPlanes = [plane];
    var mesh = new THREE.Mesh( geometry, material );
    

    Note: In r.77 some of the clipping functionality in the THREE.WebGLRenderer was moved moved to a separate THREE.WebGLClipping class, check here for reference in the three.js master branch.