首页 > 其他分享 >THREE.js学习笔记8——Textures

THREE.js学习笔记8——Textures

时间:2025-01-17 20:32:52浏览次数:1  
标签:Textures const THREE texture 纹理 材质 js 加载

这个小节主要学习纹理,Texture
纹理是覆盖几何形状表面的图像,不同类型的纹理具有多种不同的效果。
这些纹理(尤其是金属性和粗糙度)遵循PBR原则

  • 基于物理的渲染
  • 许多技术往往遵循现实生活中的方向以获得现实的结果
  • 成为现实渲染的标准
  • 许多软件、引擎和库都在使用它

如何加载纹理?
首先引入一张图片,图片确保在public目录下,以便被正确解析

const wukong = new Image();
wukong.onload = () => {
  console.log("图片已加载");
};
wukong.src = "/assets/wukong.png";

然后将这张图片转化为Texture

const wukong = new Image();
const texture = new THREE.Texture(wukong);
wukong.onload = () => {
  texture.needsUpdate = true;
};
wukong.src = "/assets/wukong.png";
const material = new THREE.MeshBasicMaterial({
  //   color: 0xff0000,
  map: texture,
});

渲染结果
1
或者使用textureLoader
为什么会有白色默认颜色和我的材质相叠加?

const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load("/assets/wukong.png");

textureLoader.load()函数中,除了第一个路径参数,还有其它三个参数,准确的说是三个回调函数

  • 加载成功-当图像加载成功时
  • 进行时-加载进行时
  • 加载错误-如果出现问题
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load(
  "/assets/rustyLake.png",
  () => {
    console.log("加载成功");
  },
  () => {
    console.log("正在运行");
  },
  () => {
    console.log("加载失败");
  }
);

同时,我们可以使用LoadingManager来看见所有的loading progress它们loading的进度

const loadingManager = new THREE.LoadingManager();
const textureLoader = new THREE.TextureLoader(loadingManager);
const loadingManager = new THREE.LoadingManager();
//通过不同的回调函数,来看见加载的过程,处理加载失败
loadingManager.onStart = () => {
  console.log("加载开始");
};
loadingManager.onLoad = () => {
  console.log("加载完成");
};
loadingManager.onProgress = () => {
  console.log("正在加载");
};

纹理以不同的方式被拉伸或挤压以覆盖在几何上,这被称为UV unwrapping.
每个点在平面(通常是正方形)上都有一个2D坐标,就是在这个几何模型的展开图上有一个屏幕的坐标。
这些UV坐标由 Three.js生成。
如果我们创建自己的几何体,则必须指定 UV 坐标
如果我们使用 3D 软件制作几何体,您还自己做
UV 展开。
我们可以在geography.attribution.uv中看到这些UV unwrapping

const geometry = new THREE.BoxGeometry(1, 1, 1);
console.log(geometry.attributes.uv);

我们可以通过使用repeat属性来重复纹理
它是具有xy属性的Vector 2
默认情况下,纹理不会重复,最后一个像素会被拉伸。我们可以用THREE.RepeatWrapping中的来改变这一点。改变wrapSwrapT

texture.repeat.x = 2;
texture.wrapT = THREE.RepeatWrapping;
texture.wrapS = THREE.RepeatWrapping;
//或者对称重复
texture.wrapT = THREE.MirroredRepeatWrapping;
texture.wrapS = THREE.MirroredRepeatWrapping;

同时,也可以将材质偏移,旋转

texture.offset.x = 0.5;
texture.offset.y = 0.5;
//现在的旋转中心是(0,0)这个坐标
texture.rotation = Math.PI * 0.25;
//我们同时也可以修改旋转中心的坐标
texture.center.x = 0.5;
texture.center.y = 0.5;

FILTERING AND MIPMAPPING

有些时候,当我们看向顶面或缩小方块时,会看到模糊的材质。这是因为Mipmapping会一次又一次地创建半个较小版本的材质(上一材质的四分之一大小),直到我们得到1x1像素的材质,所有这些材质都会被发送到GPU,当我们没有显示一整个面,GPU就会选择一些较小的材质来填充剩余的部分,达到当前模型位置下最合适的材质纹理。
所有这些都已经由Three.jsGPU处理,但我们可以选择不同的算法,有两种类型的过滤算法。
Minification Filters

  • THREE.NearestFilter
  • THREE.NearestMipmapNearestFilter
  • THREE.NearestMipmapLinearFilter
  • THREE.LinearFilter
  • THREE.LinearMipmapNearestFilter
  • THREE.LinearMipmapLinearFilter(default)

这些常量用于纹理的minFilter属性,它们定义了当被纹理化的像素映射到大于1纹理元素(texel)的区域时,将要使用的纹理缩小函数。

//NearestFilter会得到一种尖锐缩小的结果
texture.minFilter = THREE.NearestFilter;
texture.magFilter = THREE.NearestMipmapNearestFilter;

如果说我们的材质贴图很小,但是材质方块很大,以至于材质贴上去就变得模糊时,可以使用NearestFilter来将材质变得清晰而尖锐,同时,使用NearestFilter也会让性能变得更好。
如果我们使用 THREE.NearestFilter 在 minFilter 上,我们不需要Mipmapping
我们可以使用texture.generateMipmaps = false来关闭它。

texture.minFilter = THREE.NearestFilter;
texture.generateMipmaps = false;

TEXTURE FORMAT AND OPTIMISATION

材质的格式和优化,当我们在创建材质时,要考虑三个参数
  • The weight
  • The size (or the resolution)
  • The data

有些时候,用户们会下载材质,我们可以选择不同文件类型的材质和确认用户使用体验的文件大小

  • .jpg——会压缩画质,通常文件更小
  • .png——会较少的压缩画质,通常文件更大

材质纹理的每个像素都会存储在GPU上,而不管图像的到底有多大。但是GPU有存储限制,同时mipmapping又增加了要存储的像素的数量,所以作为开发人员要尝试尽可能减小图像的大小。
因为mipmapping会持续细分到1*1像素大小的材质,所以我们找的原材质大小的宽高都应该是2的n次方
同时材质纹理是支持透明度的,但我们不能在.jpg中使用透明度,如果我们想有一个结合了coloralpha的纹理,我们最好使用.png文件。
有些时候我们也可以在同一个材质中使用不同通道的值,像红,绿,蓝和alpha通道

标签:Textures,const,THREE,texture,纹理,材质,js,加载
From: https://www.cnblogs.com/xxxiCJQ/p/18676320

相关文章

  • 前端GIS三维开发必备——WebGL&Three&Cesium知识框架
    WebGL知识框架以下是一个关于WebGL知识框架,从入门到进阶的详细详解,帮助你系统性学习WebGL开发。该框架分为基础、核心、进阶、优化与工具四个部分。ICE图形学社区一、基础知识1.什么是WebGLWebGL定义与用途基于OpenGLES2.0的JavaScriptAPI用于在浏览......
  • 【华为OD-E卷 - 数组连续和 100分(python、java、c++、js、c)】
    【华为OD-E卷-数组连续和100分(python、java、c++、js、c)】题目给定一个含有N个正整数的数组,求出有多少个连续区间(包括单个正整数),它们的和大于等于x输入描述第一行两个整数Nx(0<N<=100000,0<=x<=10000000)第二行有N个正整数(每个正整数小于等于100)输出......
  • JS — 对象、数组、函数
    对象英文名称:Object。类似于C++中的map,python中的字典,由key:value对构成。value可以是变量、数组、对象、函数等。函数定义中的this用来引用该函数的“拥有者”。例如:test.js中的内容为:letperson={//定义一个对象personname:'kitty',//对象的元......
  • node.js Koa框架学习记录2
    在上一篇文章我们初步学习了写一个简单的接口,这次对目录结构以及统一数据格式,异常错误的处理目录结构优化:前端请求方法错误,我们可以通过在app.use(router.routes())后面追加一个use,告诉前端请求方法错了,而不是404Notfound:app.use(router.routes()).use(router.allowedMe......
  • NodeJS“学雷锋”志愿者管理系统-计算机毕设 附源码 39269
    NodeJS“学雷锋”志愿者管理系统目 录摘要1绪论1.1研究背景与意义1.2开发现状1.3论文结构与章节安排2 “学雷锋”志愿者管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功......
  • 使用 pdf.js 通过文件流方式加载pdf文件
    关于Pdf.js的基础知识,请参考我的博客 使用pdf.js在网页中加载pdf文件使用pdf.js跨域问题的处理方法    上面两篇博客中介绍的内容都是基于直接加载远程服务器中静态PDF文件(即URL地址)来渲染PDF的,实际业务场景中,如与第三方系统对接过程中,第三方系统不直接公开......
  • JSP美发信息综合服务与管理系统5hxk2(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着人们生活水平的提高,越来越多的人开始注重个人形象和美容美发。传统的手工管理方式已经无法满足现代美发店的需求,因此,开发美......
  • JSP芒果分销系统s94qu--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、题目芒果分销系统的设计与实现二、研究背景及意义随着信息技术的飞速发展,农业与信息技术的融合已成为推动农业现代化进程的关键力量。果农及......
  • 【前端进阶】在AI浪潮下前端如何结合应用于程序中,如:Brain.js创建模型
    前端和人工智能(AI)的结合可以创造非常丰富的用户体验,从简单的基于规则的交互到复杂的机器学习模型驱动的功能。在Web应用程序中集成AI可以增强用户交互、个性化内容推荐、图像和语音识别、自然语言处理等。前端与AI的结合应用聊天机器人(Chatbots):通过集成NLP(自然语言处理)技......
  • 【华为OD-E卷 - 最大花费金额 100分(python、java、c++、js、c)】
    【华为OD-E卷-最大花费金额100分(python、java、c++、js、c)】题目双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能的花完资金。现在请你设计一个程序帮助小明计算尽可能花费的最大资金数......