three.js 随笔 之 shader中自定义裁切面clipping_planes解析

自定义裁切面在shader中有clipping_planes_pars_vertex、clipping_planes_vertex、clipping_planes_pars_fragment、clipping_planes_fragment这几个定义。裁切面又分为全局裁切、自定义裁切,全局裁切面是对所有的物体进行裁切,在

WebGLRender中定义,自定义裁切是在物体的材质中定义的,

 

clipping_planes_pars_vertex的代码如下

#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )
varying vec3 vViewPosition;       //定义传递到片元着色器的顶点,这个顶点是相机空间中的顶点
#endif

clipping_planes_vertex的代码如下

#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )
vViewPosition = - mvPosition.xyz;   //传递到片元着色器(裁切面的法线方向导致此处顶点的负数)
#endif

clipping_planes_pars_fragment的代码如下

#if NUM_CLIPPING_PLANES > 0
#if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )
	varying vec3 vViewPosition;   //接收到顶点着色器传过来的相机空间的顶点位置(光栅化插值后)
#endif
	uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];  //裁切面数组
#endif

clipping_planes_fragment的代码如下

#if NUM_CLIPPING_PLANES > 0
	vec4 plane;
    //自定义裁切 物体的材质中定义裁切面
	#pragma unroll_loop   //目的是将下面的循环展开为一段段的代码,空间换时间
	for ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {
        //获取一个裁切面
		plane = clippingPlanes[ i ]; 
        //dot计算顶点在平面法线上的投影,w为平面法线的起点距离原点的位置,如果不在裁切面上就剔除该点 
		if ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;
	}

    //全局裁切 WebGLRender中定义裁切面
	#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES
		bool clipped = true;
		#pragma unroll_loop
		for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {
			plane = clippingPlanes[ i ];
			clipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;
		}
		if ( clipped ) discard;
	#endif
#endif

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
three.js ,可以使用 clip planes(剪平面)来实现消隐效果。剪平面允许你定义一个几何体的可见部分,而将其他部分剪掉。这种方法常用于显示复杂场景的局部视图。 要使用剪平面,首先需要创建一个 THREE.Plane 对象来定义剪平面的位置和方向。然后,通过将剪平面添加到你想要剪的对象的剪列表实现消隐效果。 下面是一个简单的示例代码,演示如何使用剪平面消隐一个立方体的一部分: ```javascript // 创建场景、相机和渲染器 var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建立方体 var geometry = new THREE.BoxGeometry(1, 1, 1); var material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); var cube = new THREE.Mesh(geometry, material); scene.add(cube); // 创建剪平面 var plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); // 剪平面位于 y=0 的位置,法线方向朝上 var planes = [plane]; // 将剪平面添加到剪列表 // 将剪列表应用于立方体 cube.userData.clippingPlanes = planes; cube.userData.clipIntersection = true; cube.userData.clipShadows = true; // 渲染场景 function render() { requestAnimationFrame(render); renderer.render(scene, camera); } render(); ``` 在这个示例,我们将一个剪平面添加到立方体的剪列表,并设置一些相关属性。通过这样做,立方体将只显示剪平面上方的部分。 你可以根据具体需求调整剪平面的位置、方向和其他属性,以实现不同的消隐效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值