three.js - 置换贴图(displacementMap)、凹凸贴图(bumpMap)、法线贴图(normalMap)、金属贴图(metalnessMap)、粗糙贴图(.roughnessMa)

这就是个灰度图

在这里插入图片描述

瞅瞅下面的贴图们,加深一下印象吧

在这里插入图片描述

说一下灰度图

灰度图中,

  • 黑色:代表最低的深度(或最低的置换)

  • 白色:代表最高的深度(或最高的置换)

  • 中间的灰度值,则代表不同程度的凹凸


置换贴图(displacementMap)

置换贴图:displacementMap

  • 置换贴图,通常使用灰度图作为输入,来模拟表面的凹凸效果。

  • 置换贴图,会实际修改物体的几何形状,通过移动顶点来创建凹凸效果,

  • 置换贴图这种效果,通常是:让点的位置,沿面法线移动一个贴图中定义的距离。

另外 置换贴图需要额外注意,要设置plane的长宽的细分

* 创建平面
参数一、二:是平面的长宽;参数三、四:是置换贴图设置的长宽的细分(`长宽都细分成200个顶点`)
const planeGeometry = new THREE.PlaneGeometry(1, 1, 200, 200)

// `MeshPhongMaterial`材质,不加环境光的话,就是黑乎乎的啥也看不见
const planeMaterial_1 = new THREE.MeshPhongMaterial({
	map: texture,
	transparent: true, // 设置是否透明
	specularMap: specularTexture,
	aoMap: aoTexture // 环境光遮蔽贴图
	normalMap: normalTexture, // 法线贴图
	// bumpMap: dispTexture, // 凹凸贴图
	displacementMap: dispTexture, `置换贴图(要设置的长宽的细分)`
	displacementScale: 0.02, // 置换的程度
})


凹凸贴图(bumpMap)

凹凸贴图:bumpMap

  • 凹凸贴图,使用灰度图来模拟表面的凹凸效果,

    但是,它并不改变物体的实际几何形状,

    而是,它通过修改表面的法线向量,来产生视觉上的凹凸感。

  • 凹凸贴图,是一种更轻量级的技术,因为它不需要修改物体的几何形状。

    因此,它在性能上通常比置换贴图更优。

  • 凹凸实际上不会影响对象的几何形状,只影响光照。如果定义了法线贴图,则将忽略该贴图。


置换、凹凸 做一下对比

  • 置换贴图、凹凸贴图,都使用灰度图作为输入,来模拟表面的凹凸效果。

  • 置换贴图,通过,实际修改物体的几何形状来创建凹凸效果
    凹凸贴图,通过,修改表面的法线向量来产生视觉上的凹凸感

  • 置换贴图,通常需要更多的计算资源,而凹凸贴图在性能上更优


法线贴图(normalMap)

  • 法线贴图,用于模拟物体表面微小凹凸细节的高度信息的技术

  • 法线贴图,包含了表面法线方向的信息,可以让光照在物体表面产生更加生动的变化和阴影效果,从而增强物体表面的真实感、立体感。

  • 法线贴图,不会改变曲面的实际形状,只会改变光照。

  • 渲染效果:在渲染场景时,光照效果会根据法线贴图中的法线信息在物体表面产生细微的变化,从而使得物体表面的凹凸细节更加清晰和真实

这种就是 法线贴图
在这里插入图片描述


金属贴图、粗糙贴图

在这里插入图片描述


金属贴图:`metalnessMap` 和 粗糙贴图:`roughnessMap`,是用于模拟物体表面属性的两种重要贴图技术,

这两种贴图,通常与基于物理的渲染(PBR)材质(如:`MeshStandardMaterial`)一起使用,以创建更真实和逼真的3D渲染效果。

  • 金属贴图metalnessMap

1、定义:金属贴图,用于定义模型表面的金属度,即:材质像金属的程度

2、贴图原理:
	金属贴图,通常使用'灰度图像',
	其中,
	'白色':表示,完全金属质感的区域,
	'黑色':表示,非金属质感的区域,
	'灰度值':则表示不同程度的金属质感,

3、使用方式:通过为`MeshStandardMaterial``metalnessMap`属性提供一个纹理贴图,可以控制模型表面不同区域的金属度。

  • 粗糙贴图roughnessMap

1、粗糙贴图,用于定义模型表面的粗糙程度,即:表面的光滑或粗糙程度。

2、贴图原理:
	粗糙贴图,通常使用'灰度图像',
	其中,
	'白色':表示,非常光滑的表面,
	'黑色':表示,非常粗糙的表面,
	'灰度值':则表示不同程度的粗糙度,

3、使用方式:通过为`MeshStandardMaterial``roughnessMap`属性提供一个纹理贴图,可以控制模型表面不同区域的粗糙度。

  • 33
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现星云效果需要用到 Three.js 中的点云(PointCloud)和着色器(Shader)。 首先,在 Vue 项目中安装 Three.js: ``` npm install three --save ``` 然后,创建一个 Vue 组件,并在 mounted 钩子函数中创建 Three.js 场景和相机: ```javascript <template> <div ref="container"></div> </template> <script> import * as THREE from 'three'; export default { name: 'Nebula', mounted() { // 创建场景 const scene = new THREE.Scene(); // 创建相机 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; // 创建渲染器 const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setClearColor('#000000'); renderer.setSize(window.innerWidth, window.innerHeight); // 将渲染器添加到页面中 this.$refs.container.appendChild(renderer.domElement); // 渲染场景 const render = () => { renderer.render(scene, camera); requestAnimationFrame(render); }; render(); }, }; </script> <style> canvas { width: 100%; height: 100%; } </style> ``` 接下来,创建一个点云和着色器: ```javascript mounted() { // ... // 创建点云 const geometry = new THREE.BufferGeometry(); const positions = []; for (let i = 0; i < 10000; i++) { const x = Math.random() * 2000 - 1000; const y = Math.random() * 2000 - 1000; const z = Math.random() * 2000 - 1000; positions.push(x, y, z); } geometry.addAttribute('position', new THREE.Float32BufferAttribute(positions, 3)); const material = new THREE.PointsMaterial({ size: 5 }); const points = new THREE.Points(geometry, material); scene.add(points); // 创建着色器 const vertexShader = ` uniform float time; attribute vec3 displacement; void main() { vec3 newPosition = position + displacement * sin(time); gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0); } `; const fragmentShader = ` uniform vec3 color; void main() { gl_FragColor = vec4(color, 1.0); } `; const shaderMaterial = new THREE.ShaderMaterial({ uniforms: { time: { value: 0 }, color: { value: new THREE.Color('#ffffff') }, }, vertexShader, fragmentShader, }); // 将着色器应用到点云上 const shaderGeometry = new THREE.BufferGeometry(); const shaderPositions = []; for (let i = 0; i < 10000; i++) { const x = Math.random() * 2000 - 1000; const y = Math.random() * 2000 - 1000; const z = Math.random() * 2000 - 1000; shaderPositions.push(x, y, z); } shaderGeometry.addAttribute('position', new THREE.Float32BufferAttribute(shaderPositions, 3)); shaderGeometry.addAttribute('displacement', new THREE.Float32BufferAttribute(positions, 3)); const shaderPoints = new THREE.Points(shaderGeometry, shaderMaterial); scene.add(shaderPoints); // 更新着色器 const update = () => { shaderMaterial.uniforms.time.value += 0.05; }; render(); setInterval(update, 50); }, ``` 最后,可以在着色器中添加一些特效,比如星云的颜色、大小、运动轨迹等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值