Three.js 快速入门教程【十】常见的纹理类型

系列文章目录
Three.js 快速入门教程【一】开启你的 3D Web 开发之旅
Three.js 快速入门教程【二】透视投影相机
Three.js 快速入门教程【三】渲染器
Three.js 快速入门教程【四】三维坐标系
Three.js 快速入门教程【五】动画渲染循环
Three.js 快速入门教程【六】相机控件 OrbitControls
Three.js 快速入门教程【七】常见几何体类型
Three.js 快速入门教程【八】常见材质类型
Three.js 快速入门教程【九】光源类型
Three.js 快速入门教程【十】常见的纹理类型
文章目录
- 系列文章目录
- 一、前言
- 二、纹理基础概念
- 二、常见纹理类型
- 1. 普通纹理(Texture)
- 1.1 使用的加载器
- 1.2 示例
- (1) 示例1——立方体6面贴图
- (2) 示例2——地球
- 2. 法线纹理(NormalTexture)
- 2.1 使用的加载器
- 2.2 核心代码
- 3. 凹凸纹理(BumpTexture)
- 3.1 使用的加载器
- 3.2 核心代码
- 3.3 与法向纹理区别
- 4. 立方体纹理(CubeTexture)
- 4.1 使用的加载器
- 4.2 示例
- 示例1——实现一个天空盒
- CubeTexture 的映射方式
- 示例2——反射周围的环境
- 5.视频纹理(VideoTexture )
- 使用的加载器
- 示例
- 五、免费纹理资源
- 六、总结
一、前言
在 Three.js 中,纹理是为 3D 模型添加细节和真实感的重要元素。通过纹理,我们可以为模型表面赋予各种材质和图案,如木纹、石纹、金属光泽等。本文将介绍 Three.js 中一些常见的纹理类型和使用讲解。
二、纹理基础概念
在 Three.js 里,Texture(纹理) 可以理解为是一种数据(大部分是图片),它被映射到 3D 模型的表面上,用来模拟各种材质的外观,比如木材的纹理、金属的光泽、石头的表面等等。通过合理地应用纹理,我们能够让 3D 模型看起来更加逼真和生动
在 Three.js 中,纹理是通过 Texture 类及其子类来表示的。Texture 类是所有纹理的基类,它定义了纹理的一些通用属性和方法。常见的纹理子类包括 TextureLoader、CubeTextureLoader 等,用于加载不同类型的纹理。
二、常见纹理类型
1. 普通纹理(Texture)
普通纹理是最基本的纹理类型,也是所有纹理的基类,它直接使用一张图片作为纹理。在 Three.js 中,通常使用 TextureLoader 来加载纹理图片。
1.1 使用的加载器
TextureLoader
1.2 示例
(1) 示例1——立方体6面贴图
// 创建纹理
const textureLoader = new THREE.TextureLoader();
//加载纹理图片
const texture = textureLoader.load('texture.jpg');
// 创建材质并应用纹理
const material = new THREE.MeshBasicMaterial({ map: texture });
// 创建一个立方体
const geometry = new THREE.BoxGeometry(5,5,5);
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

(2) 示例2——地球
// 创建纹理
const textureLoader = new THREE.TextureLoader();
//加载纹理图片
const texture = textureLoader.load('earth.jpg');
// 创建材质并应用纹理
const materials =new THREE.MeshLambertMaterial({ map: texture })
// 创建一个球体
const geometry = new THREE.SphereGeometry(1, 32, 32);
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

ps:材质构造函数有个map属性可设置普通纹理
2. 法线纹理(NormalTexture)

法线纹理用于模拟表面的凹凸效果,通过改变表面的法线方向来产生光影变化,所以虚拟场景中至少有一个光源,如点光源(PointLight)、平行光(DirectionalLight)或聚光灯(SpotLight)等。法线纹理通常是一张 RGB 格式的彩色图片,每个像素的颜色值表示法线的方向。
2.1 使用的加载器
TextureLoader
2.2 核心代码
//加载普通纹理
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load("texture.png");// 加载法线纹理
const normalTextureLoader = new THREE.TextureLoader();
const normalTexture = normalTextureLoader.load('normal_texture.jpg');// 创建一个材质并应用法线纹理
const material = new THREE.MeshStandardMaterial({map: texture,//普通纹理normalMap: normalTexture,//法线纹理normalScale: new THREE.Vector2(1, 1) // 控制法线纹理的强度
});
//创建一个长方体
const geometry= new THREE.BoxGeometry(100, 50,10);
const mesh= new THREE.Mesh(geometry, material );
scene.add(mesh);

- 物理、标准或高光材质构造函数有个normalMap属性设置法线纹理
- normalScale属性 是一个 Vector2 对象,用于控制法线贴图的强度,值越大表面凹凸感越强
3. 凹凸纹理(BumpTexture)

凹凸纹理是一张灰度图像,图像中的每个像素值代表该位置表面的相对高度。较亮的像素代表凸起,较暗的像素代表凹陷。在光照计算时,Three.js 会根据凹凸纹理的像素值来调整表面法线的方向,从而模拟出凹凸的视觉效果,实际上几何形状并未被改变,所以虚拟场景中和法线纹理一样要求至少有一个光源。
3.1 使用的加载器
TextureLoader
3.2 核心代码
//加载普通纹理
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load("texture.png");// 加载凹凸纹理
const bumpTextureLoader= new THREE.TextureLoader();
const bumpTexture= bumpTextureLoader.load('bump_texture.png');// 创建一个材质并应用凹凸纹理
const material = new THREE.MeshStandardMaterial({map: texture,//普通纹理bumpMap: normalTexture, //凹凸纹理bumpScale:1, // 调整凹凸效果的强度
});
//创建一个矩形平面
const geometry= new THREE.PlaneGeometry(100, 100);
const mesh = new THREE.Mesh(geometry, material );
scene.add(mesh );

- 物理、标准或高光材质构造函数有个bumpMap属性设置凹凸纹理
- bumpScale属性 用于控制凹凸效果的强度,值越大表面凹凸感越强
3.3 与法向纹理区别
1、 原理不同
凹凸纹理通过灰度值区别呈现凹凸效果,而法向纹理通过每个像素的 RGB 值偏移量设置实现
2、效果表现
凹凸纹理效果相对较为柔和、简单。在表现小尺度的细节和高光反射时不够真实,通常用于表现一些相对平滑、低细节的表面凹凸,如轻微的波纹、粗糙的石头表面等。
法向纹理能够呈现出非常精细、真实的表面细节和凹凸效果。高光和阴影的过渡更加自然,即使在近距离观察或物体表面角度变化较大时,也能保持良好的视觉效果,适用于表现具有丰富细节的表面,如砖块的缝隙、皮革的纹理、金属的划痕等。
4. 立方体纹理(CubeTexture)
立方体纹理是由六个单独的纹理面(通常是正方形图片)组成,这些面分别对应一个虚拟立方体的六个面:正面、背面、顶面、底面、左面和右面。在 Three.js 场景中,它常被用于模拟环境,比如天空盒,让场景中的物体仿佛处于一个真实的环境当中,也可以用于反射效果,使物体能够反射周围的环境。
4.1 使用的加载器
CubeTextureLoader
4.2 示例
示例1——实现一个天空盒
// 创建 CubeTextureLoader
const cubeTextureLoader = new THREE.CubeTextureLoader();
// 加载立方体纹理的六张图片
// 这里的路径示例请根据实际情况修改
cubeTextureLoader.setPath('textures/');
cubeTextureLoader.load(['px.jpg', // 右面'nx.jpg', // 左 面'py.jpg', // 上 面'ny.jpg', // 下 面'pz.jpg', // 前 面'nz.jpg' // 后 面],(cubeTexture)=> {// 设置纹理的映射方式cubeTexture.mapping = THREE.CubeReflectionMapping;// 创建一个用于天空盒的材质const skyboxMaterial = new THREE.MeshBasicMaterial({envMap: cubeTexture,//环境贴图side: THREE.BackSide //渲染背面});// 创建一个大的立方体作为天空盒const skyboxGeometry = new THREE.BoxGeometry(1000, 1000, 1000);const skybox = new THREE.Mesh(skyboxGeometry, skyboxMaterial);scene.add(skybox);}
);
在上述代码中,我们首先创建了 CubeTextureLoader 实例,通过 setPath 方法设置图片的路径前缀,然后使用 load 方法加载六张分别对应立方体六个面的图片。当加载完成后,我们设置了纹理的映射方式为 THREE.CubeReflectionMapping(用于反射效果),并创建了一个 MeshBasicMaterial 材质,将立方体纹理应用到该材质上,最后创建一个大的立方体作为天空盒添加到场景中。
运行效果:
天空盒示例
CubeTexture 的映射方式
纹理mapping属性控制着纹理在模型表面的映射方式
CubeTexture 有不同的映射方式,常见的有:
- THREE.CubeReflectionMapping:这种映射方式常用于模拟物体的反射效果,让物体能够反射周围的环境。例如在创建一个金属质感的物体时,使用这种映射方式可以让物体看起来像是反射了周围的场景。
- THREE.CubeRefractionMapping:用于模拟折射效果,比如创建一个透明的玻璃物体时,通过这种映射方式可以让物体产生折射的视觉效果,仿佛光线穿过了物体。
ps:立方体纹理要求用于六个面的图片是正方形,也就是长宽一样
示例2——反射周围的环境
在示例1基础上我们新建一个光滑的球体使其表面反射周围环境
// 创建 CubeTextureLoader
const cubeTextureLoader = new THREE.CubeTextureLoader();
// 加载立方体纹理的六张图片
// 这里的路径示例请根据实际情况修改
cubeTextureLoader.setPath('textures/');
cubeTextureLoader.load(['px.jpg', // 正 X 面'nx.jpg', // 负 X 面'py.jpg', // 正 Y 面'ny.jpg', // 负 Y 面'pz.jpg', // 正 Z 面'nz.jpg' // 负 Z 面],(cubeTexture)=> {// 设置纹理的映射方式cubeTexture.mapping = THREE.CubeReflectionMapping;// 创建一个用于天空盒的材质const skyboxMaterial = new THREE.MeshBasicMaterial({envMap: cubeTexture,side: THREE.BackSide //渲染背面});// 创建一个大的立方体作为天空盒const skyboxGeometry = new THREE.BoxGeometry(1000, 1000, 1000);const skybox = new THREE.Mesh(skyboxGeometry, skyboxMaterial);scene.add(skybox);// 创建一个球体几何体const geometry = new THREE.SphereGeometry(1, 32, 32);// 创建一个标准材质const material = new THREE.MeshStandardMaterial({metalness: 1,//金属性roughness: 0.05, //粗糙度envMap:cubeTexture//环境贴图});// 创建球体网格const sphere = new THREE.Mesh(geometry, material);scene.add(sphere);}
);

5.视频纹理(VideoTexture )
VideoTexture 本质上是 Three.js 对 HTML5 元素的一种封装,它能够实时地将视频内容映射到 3D 模型上,使得模型表面呈现出动态的画面。与普通的静态纹理(如图片纹理)不同,VideoTexture 会随着视频的播放而不断更新,创造出诸如动态广告屏幕、虚拟视频墙等有趣的效果
使用的加载器
VideoTexture
示例
html
<video id="myVideo" autoplay loop muted><source src="your_video_file.mp4" type="video/mp4">
</video>
html文件中创建一个 元素,并设置好视频的源文件、自动播放等属性
js
import * as THREE from 'three';// 获取 HTML 中的视频元素
const video = document.getElementById('myVideo');
// 创建 VideoTexture
const videoTexture = new THREE.VideoTexture(video);
// 创建一个长方体几何体
const geometry= new THREE.BoxGeometry(10, 5,1);
// 创建材质并应用视频纹理
const material = new THREE.MeshBasicMaterial({ map: videoTexture });
const mesh = new THREE.Mesh(geometry, material);const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);scene.add(mesh);
camera.position.z = 10;function animate() {requestAnimationFrame(animate);// 更新视频纹理videoTexture.needsUpdate = true;renderer.render(scene, camera);
}
animate();

五、免费纹理资源
免费的纹理资源可以访问Poly Haven网站,该网站不仅有免费纹理资源还有3d模型和全景图片提供下载调试
六、总结
通过本文的介绍,我们了解了 Three.js 中一些常见的纹理类型及其使用方法,对纹理在 3D 场景构建中的作用有了较为全面的认识。从基础的 Texture 加载和应用,到 CubeTexture 为场景带来的环境映射效果,每一种纹理都有着独特的功能和应用场景。在实际开发中,可以根据具体需求灵活运用这些纹理和属性,打造出独特的 3D 效果。
更多three.js入门知识点请关注该系列教程后续的更新。
相关文章:
Three.js 快速入门教程【十】常见的纹理类型
系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...
文档识别-C#中英文文档识别接口-PDF文件内容识别API
文档识别接口可满足用户在数字化转型过程中对文档处理的高效、准确需求。翔云文档识别接口以成熟的文字识别技术、自然语言处理技术、图像识别技术为核心,能够将文档上的非可编辑文本转化为可编辑的数据,从而提升信息处理的速度与实现文档数字化管理的准…...
gRPG协议
gRPG协议是一种用于游戏开发的网络通信协议,全称为Game Real-time Protocol。它主要用于实现实时多人游戏中的数据传输和同步。gRPG协议的设计目标是提供低延迟、高可靠性的数据传输,以支持游戏中的实时互动和状态同步。 gRPG协议的特点 低延迟&#x…...
【maven打包错误】 无效的目标发行版:16
maven打包错误 错误截图 About 故事在一个风和日丽的下午,我一如往常的摸鱼,突如其来的事情打乱我的摸鱼节奏,“为什么测试不能用了” ,随着前端帅哥一声轻咦,故事便开始了,我检查发现是是磁盘满了&#x…...
Oracle 查询表空间使用情况及收缩数据文件
本文介绍Oracle收缩数据文件的相关操作,运维工作中有时会需要通过收缩数据文件来释放磁盘空间。 数据文件初始化方式: 1.我们创建表空间一般有两种方式初始化其数据文件,即指定初始大小为32G(很大的值)或指定初始大小为…...
Transformer 代码剖析1 - 数据处理 (pytorch实现)
引言 Transformer 架构自《Attention Is All You Need》论文发表以来,在自然语言处理领域引起了巨大的变革。它摒弃了传统的循环结构,完全基于注意力机制,显著提高了处理序列数据的效率和性能。本文将通过对一个具体的项目代码结构进行详细分…...
Python异常处理面试题及参考答案
目录 什么是 Python 中的异常?程序为什么需要异常处理机制? 解释 BaseException 和 Exception 的区别 Python 的异常处理与传统的错误代码返回机制相比有哪些优势? 列出至少 5 个 Python 内置异常类型并说明触发场景 语法错误 (SyntaxError) 与运行时异常 (Runtime Erro…...
Python多线程知多少
目录 目标 Python版本 官方文档 概述 线程 守护线程 线程同步 事件对象(Event Object) 实战 创建线程的基本语法 阻塞线程 守护线程 线程同步的方法 互斥锁(排他锁) 信号量(Semaphore) 事件…...
C++ Qt常见面试题(8):C++ Qt中的线程同步与互斥
在C++ Qt中,线程同步和互斥通常通过 QMutex 和 QMutexLocker 来实现。线程同步确保多个线程不会同时访问共享资源,而互斥机制通过锁定一个资源,确保在任何给定时刻只有一个线程能够访问它。 以下是一个使用 QMutex 来同步和互斥访问共享资源的详细示例代码: 1. 使用 QMut…...
数字内容个性化推荐的关键是什么?
智能算法交互体系构建 构建数字内容体验的智能推荐系统,本质上是实现数据驱动与算法响应的动态协同。其核心在于建立多维度用户数据与机器学习模型的深度交互链路——通过实时采集用户点击、停留时长、交互路径等行为特征,结合设备属性、场景状态等上下…...
DeepSeek-OpenSourceWeek-第三天-Release of DeepGEMM
DeepGEMM:这是一款专为高效的 FP8(8 位浮点)通用矩阵乘法(GEMMs)而开发的尖端库。GEMMs 是许多 AI 工作负载(尤其是深度学习)中的基本操作。 特点: 支持稠密和 MoE GEMMs:它可以处理标准的稠密矩阵乘法以及混合专家(MoE)模型中使用的矩阵乘法。MoE 是一种神经网络架…...
LeetCode 1472.设计浏览器历史记录:一个数组完成模拟,单次操作均O(1)
【LetMeFly】1472.设计浏览器历史记录:一个数组完成模拟,单次操作均O(1) 力扣题目链接:https://leetcode.cn/problems/design-browser-history/ 你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage ,…...
AI+游戏,正在进行时!
2月,DeepSeek引领的AI浪潮对游戏行业造成了巨大冲击。 2月17日马斯克在社交平台宣布,xAI将成立一家AI游戏工作室,高调宣布两大核心理念,打破大公司的垄断,利用AI重构游戏体验。随后的新闻中还表示,团队计划…...
贪心算法精品题
1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…...
sql server 复制从备份初始化数据
参考 : 从备份初始化订阅(事务) - SQL Server | Microsoft Learn sql server 复制默认是用快照初始化数据的,也支持从备份初始化数据,参考如上...
【蓝桥杯】1.k倍区间
前缀和 #include <iostream> using namespace std; const int N100010; long long a[N]; int cnt[N]; int main(){int n, m;cnt[0] 1;cin >> n >> m;long long res 0;for(int i 1; i < n; i){scanf("%d", &a[i]);a[i] a[i-1];res cnt…...
Qt互斥锁(QMutex)的使用、QMutexLocker的使用
Qt互斥锁【QMutex】的使用、QMutexLocker的使用 Chapter1 Qt互斥锁(QMutex)的使用、QMutexLocker的使用一、QMutexLocker和QMutex实现示例图二、QMutex和QMutexLocker的关系(个人理解)三、QMutex使用和QMutexLocker使用1.QMutex的使用2.QMutexLocker的使…...
具身智能(Embodied AI)的物理交互基准测试:构建真实世界的智能体评估体系
文章目录 引言:从虚拟到物理的智能跃迁一、具身智能测试体系设计1.1 评估维度矩阵1.2 测试平台技术栈二、核心测试场景构建2.1 基础运动能力测试集2.2 复杂操作任务设计三、物理仿真引擎关键技术3.1 高精度接触力学模型3.2 传感器噪声模拟四、评估指标体系4.1 量化指标公式4.2…...
Javaweb后端数据库多表关系一对多,外键,一对一
多表关系 一对多 多的表里,要有一表里的主键 外键 多的表上,添加外键 一对一 多对多 案例...
鸿蒙 ArkUI 实现敲木鱼小游戏
敲木鱼是一款具有禅意的趣味小游戏,本文将通过鸿蒙 ArkUI 框架的实现代码,逐步解析其核心技术点,包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块: ├── entry…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
