threejs (四) 纹理 Texture

定义:纹理图片(或canvas/video等)映射到物体表面,或者作为反射、折射贴图,也就是物体的皮肤。

1、纹理贴图分类

  • map:颜色贴图,存储颜色信息
  • bumpMap:凹凸贴图,性能贴图,也称为高度贴图,性能开销比较大,会移动表面纹理的可见区域,从而实现表面遮挡效果
  • mormalMap:法线贴图,通过RGB三个分量分别表示向量的xyz三个方向,并且通过图片保留几何体表面的几何细节
  • aoMap:环境贴图,AO贴图,模拟物体之间所产生的阴影,在不打光的时候增加体积感
  • roughnessMap:光滑度贴图,该纹理的绿色通道用于改变材质的粗糙度。
  • alphaMap:透明度贴图,是一张灰度纹理,用于控制整个表面的不透明度。(黑色:完全透明;白色:完全不透明)
  • lightMap:光照贴图

2、纹理贴图原理

在光栅化过程中使用双线性插值计算每个像素的纹理坐标(UV)
在纹素数组中查找纹理坐标(使用最近的或四个最近的线性插值)
使用纹理的颜色作为像素的颜色,或者组合纹理和像素的颜色

3、加载贴图

3.1 使用image加载

	 	const img = new Image();const texture = new THREE.Texture(img);img.src ='/public/textures/Wood_Ceiling_Coffers_003/Wood_Ceiling_Coffers_003_basecolor.jpg';img.onload = () => {console.log('loaded texture', texture);texture.needsUpdate = true; // 加载前纹理为空,加载成功之后需要告诉js更新,下次tick就会重新读取对象};

3.2 使用load加载

支持成功失败的回调、但是不支持加载中的回调

		// 跨域 setCrossOrigin('anonymous')this.texture = loader.setCrossOrigin('anonymous').load(// 资源URL'/public/textures/Wood_Ceiling_Coffers_003/Wood_Ceiling_Coffers_003_basecolor.jpg',// onLoad回调(texture) => {texture.needsUpdate = true;},// 目前暂不支持onProgress的回调undefined,// onError回调function (err) {console.error('An error happened.');});

3.3 支持加载中回调

const texture = new THREE.TextureLoader().setCrossOrigin('Anonymous') // 设置允许跨域.load('/public/textures/Material_1741/basecolor.jpg', // 这里换成了绝对路径// onLoad回调() => {console.log('load');},// process 回调, r84+ 被弃用() => {console.log('process');},// onError回调(error) => {console.log('error', error);},
);// 使用 loadingManager 监控加载情况
const loadingManager = new THREE.LoadingManager();loadingManager.onStart = (url, itemsLoaded: Index, itemsTotal: Number) => {console.log('start', url, itemsLoaded, itemsTotal);
};
loadingManager.onLoad = () => {console.log('loaded');
};
loadingManager.onProgress = (url, itemsLoaded: Index, itemsTotal: Number) => {console.log('process', url, itemsLoaded, itemsTotal);
};
loadingManager.onError = (url) => {console.log('error', url);
};const textureLoader = new THREE.TextureLoader(loadingManager);
const texture = textureLoader.load('/public/textures/Material_1741/basecolor.jpg',() => {console.log('load');},// process 回调, r84+ 被弃用undefined,// onError回调(error) => {console.log('error', error);},
);console.log(texture);

4、物体添加纹理

其他属性都会影响纹理的渲染效果

 const material = new THREE.MeshLambertMaterial({color: 0x1890ff,map: this.texture, //纹理transparent: true,opacity: 0.5,wireframe: true,});

每个面设置不同的贴图

// 每个面设置不同的贴图const materials = [];for (let i = 0; i < boxGeometry.groups.length; i++) {// 纹理贴图const texture = this.textureLoader.setCrossOrigin('anonymous').load(// 资源URL`/public/textures/fullscreen/0${i + 1}.jpg`);materials.push(new THREE.MeshBasicMaterial({map: texture,}));}const box = new THREE.Mesh(boxGeometry, materials);

一个物体设置多个贴图纹理

const material = new THREE.MeshLambertMaterial({map: colorTexture,aoMap: aoTexture,bumpTMap: bumpTexture,displacementMap: bumpTexture,normalMap: normalTexture,roughnessMap: roughnessTexture,});

mipmap:多级渐远纹理 texture.magFilter = THREE.NearestFilter;
优点:
1.质里高:避免了在远距离情况下的采样频率低和数据频率高造成的失真和摩尔纹
2.性能好: 避免了不使用Mipmap下距离远时采样频率低和数据频率高而照成 texture cache命中率不高(相邻pixel采样Texel时uv相差比较大)使性能下降。
缺点:
占用显存,可使用ue的纹理流缓存优化(IO换显存)。
在这里插入图片描述

5、不同的纹理贴图

5.1 AO贴图

const boxMaterial = new THREE.MeshBasicMaterial({map: this.texture,aoMap: this.aoTexture, //在纹理较暗的地方添加阴影aoMapIntensity: 1, //环境遮挡效果的强度。默认值为1。零是不遮挡效果});gui.add(this.box.material, 'aoMapIntensity', 0, 1, 0.1);

在这里插入图片描述

5.2 凹凸贴图

const boxMaterial = new THREE.MeshLambertMaterial({map: this.texture,// aoMap: this.aoTexture, //在纹理较暗的地方添加阴影// aoMapIntensity: 1,bumpMap: this.bumpTexture,bumpScale: 10,});

在这里插入图片描述

5.3 位移贴图

 const boxMaterial = new THREE.MeshLambertMaterial({map: this.texture,aoMap: this.aoTexture, //在纹理较暗的地方添加阴影aoMapIntensity: 1,// bumpMap: this.bumpTexture,// bumpScale: 10,displacementMap: this.bumpTexture,displacementBias: 0, //位移贴图在网格顶点上的便宜量displacementScale: 0, //位移贴图对网格的影响成都(黑色无位移,白色是最大的位移)});

在这里插入图片描述

5.4 法线贴图

对于有高光材质的效果比较明显,不会改变曲面的实际形状,只会改变光照

normalMap: this.normalTexture,
gui.add(this.box.material.normalScale, 'x', 0, 1, 0.1);
gui.add(this.box.material.normalScale, 'y', 0, 1, 0.1);

在这里插入图片描述

5.5 光滑度贴图

0表示平滑的镜面反射,1表示完的漫反射

 roughnessMap: this.roughnessTexture,gui.add(this.box.material, 'roughness', 0, 1, 0.1);

在这里插入图片描述

5.6 金属贴图

非金属材质使用0.0,金属材质使用1,中间值经常代表表面生锈

metalnessMap: this.metalTexture,
gui.add(this.box.material, 'metalness', 0, 1, 0.1);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178836.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的在线外卖管理系统

基于SpringBootVue的在线外卖管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 下单界面 登录界面 商家界面 摘要 本文介绍了一种基于Spring Boot和…

绩效考核管理项目|记录1

项目用C#winformSQL Server写的&#xff0c;现在记录一下学习到的新东西。 winform工具 splitContainer&#xff1a;分割出两个容器&#xff0c;能添加面板之类的工具 treeview&#xff1a;展示标签页的分层集合&#xff08;用户管理、基数管理......&#xff09;&#xff0…

分享篇:我用数据分析做副业

主业是数据分析专家&#xff0c;副业是数据咨询顾问&#xff0c;过去十年里面利用数据分析发家致富 人生苦短&#xff0c;我学Python&#xff01; 利用技能可以解决的问题&#xff0c;哪些场景下可以催生出需求&#xff0c;深度剖析数据分析的技能树 由浅入深&#xff0c;一个…

js 变量声明与赋值 笔试踩坑题

文章目录 概述函数声明函数形参与实参函数预编译用一个例子说明一下&#xff0c;这四个步骤分别要干些什么。重复四个步骤&#xff0c;反复练习一下 全局编译多重执行期上下文 概述 别小看变量声明与赋值&#xff0c;在所有的笔试中&#xff0c;基本都会考&#xff0c;这个要多…

JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

git 命令行回退版本

git 命令行回退版本 git 命令行回退版本命令: 1.切换到需要回退的分支 git checkout branch-v2.0.02.更新远程分支 git fetch3.找到需要回退版本的版本号git revert a6914da55ff40a09e67ac2426b86f1212e6580eb4.清除工作区缓存git clean -df5.强制提交git push -f

解决Python requests库不支持发送可迭代对象的问题

在加班的路上&#xff0c;bug是那永远的陪伴。对于程序员来说&#xff0c;bug就像黑暗中的萤火虫&#xff0c;虽然微弱却永远指引着前进的方向。今天&#xff0c;我们要探讨的是Python requests库在处理可迭代对象时遇到的问题&#xff0c;这是一道让许多开发者头痛的难题。本文…

阿里云今年服务器是真便宜,看看哪些云服务器值得买!

2023年双十一&#xff0c;阿里云推出了一项令人惊喜的独家优惠活动&#xff01;在这次活动中&#xff0c;阿里云开放了老用户购买权限&#xff0c;以超低的价格购买云服务器ECS经济型e实例。这款服务器配置了2核2G内存、3M固定带宽和40G ESSD entry系统盘。而且&#xff0c;更棒…

一个用于操作Excel文件的.NET开源库

推荐一个高性能、跨平台的操作Excel文件的.NET开源库。 01 项目简介 ClosedXML是一个.NET第三方开源库&#xff0c;支持读取、操作和写入Excel 2007 (.xlsx&#xff0c; .xlsm)文件&#xff0c;是基于OpenXML封装的&#xff0c;让开发人员无需了解OpenXML API底层API&#xf…

技巧篇:在Pycharm中配置集成Git

一、在Pycharm中配置集成Git 我们使用git需要先安装git工具&#xff0c;这里给出下载地址&#xff0c;下载后一路直接安装即可&#xff1a; https://git-for-windows.github.io/ 0. git中的一些常用词释义 Repository name&#xff1a; 仓库名称 Description(可选)&#xff1a;…

hyper-v外部网络,ssh服务正常,可以ping通虚拟机,但是无法远程连接虚拟机。

问题&#xff1a; ssh服务正常&#xff0c;可以ping通虚拟机&#xff0c;虚拟机可上网&#xff0c;一切正常&#xff0c;但是无法远程连接虚拟机。 报错&#xff1a;Network error: Connection refused 解决&#xff1a; 在本机的网络设置中&#xff0c;这个东西不知道是什么…

呼叫中心有什么特色功能呢,okcc呼叫系统

随着科技的发展&#xff0c;智能呼叫中系统的出现帮助不少企业解决了问题&#xff0c;那么呼叫中心有什么功能呢&#xff1f; 1、来电弹屏 呼叫中心通话弹出屏功能与系统提供的CRM系统相结合&#xff0c;可根据通话号码自动匹配客户数据&#xff0c;通话显示用户历史服务记录或…