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);
});