MeshDepthMaterial

MeshDepthMaterial

描述

一种基于相机视距渲染几何体的特殊材质,深度值会被映射到黑白渐变(最近处为白色,最远处为黑色)

构造函数(Constructor)

构造函数 描述
new THREE.MeshDepthMaterial(parameters?: Object) 创建一个材质。
参数 描述
parameters (可选) 材质配置对象,支持以下所有属性

属性(Properties)

属性 类型 描述
贴图控制
.map Texture 基础颜色贴图(支持alpha通道)。默认值为 null。
.alphaMap Texture 灰度贴图控制透明度(黑透明白不透明),默认值为 null。
.displacementMap Texture 顶点位移贴图(白色区域位移最大),默认值为 null。
位移调节
.displacementScale Float 默认值为 1。
.displacementBias Float 默认值为 0。
渲染样式
.wireframe Boolean 启用线框模式,默认值为 false。
.depthPacking Constant 深度值压缩算法,默认值为 BasicDepthPacking。
线宽限制:由于WebGL规范限制,wireframeLinewidth实际渲染时总为1

方法(Methods)

方法 描述
共有方法 参见其基类 Material。

示例

typescript 复制代码
// 初始化场景、相机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建深度材质
const depthMaterial = new THREE.MeshDepthMaterial({
  // 基础配置
  depthPacking: THREE.RGBADepthPacking,
  
  // 贴图配置(按需添加)
  map: new THREE.TextureLoader().load('textures/diffuse.jpg'),  // 颜色贴图
  alphaMap: new THREE.TextureLoader().load('textures/alpha.png'), // 透明度贴图
  
  // 位移效果配置
  displacementMap: new THREE.TextureLoader().load('textures/height.png'),
  displacementScale: 0.5,
  displacementBias: -0.25,
  
  // 线框模式
  wireframe: false
});

// 创建几何体并应用材质
const geometry = new THREE.TorusKnotGeometry(1, 0.4, 100, 16);
const mesh = new THREE.Mesh(geometry, depthMaterial);
scene.add(mesh);

// 添加参考网格和灯光
scene.add(new THREE.GridHelper(10, 10));
scene.add(new THREE.AmbientLight(0x404040));

// 相机位置
camera.position.z = 3;

// 动画循环
function animate() {
  requestAnimationFrame(animate);
  mesh.rotation.x += 0.01;
  mesh.rotation.y += 0.01;
  renderer.render(scene, camera);
}
animate();

// 响应窗口变化
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
});