【Three.js】知识梳理十一:Three.js高级纹理类型

2024-06-12 15:52

本文主要是介绍【Three.js】知识梳理十一:Three.js高级纹理类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 在使用Three.js创建3D图形时,纹理扮演着重要的角色,它们可以增加模型的视觉效果,使模型看起来更加真实。本文将深入讨论几种高级纹理类型:法线贴图(Normal Maps),凹凸贴图(Displacement Maps),高光贴图(Specular Maps),环境贴图(Environment Maps)以及数据纹理(Data Textures)。

1. 法线贴图

法线贴图是一种存储了一个模型表面法向量信息的纹理,它可以提供更多的表面细节,使模型看起来更加真实。法线贴图中的每个像素都存储了一个对应表面位置的法向量,这些法向量在渲染时用于计算光照,从而模拟出更复杂的表面细节。

使用法线贴图,我们可以在不增加模型顶点数的情况下,模拟出高精度模型的表面细节。在Three.js中,可以使用MeshStandardMaterialMeshPhongMaterialnormalMap属性来指定法线贴图:

var normalMap = new THREE.TextureLoader().load('textures/normalMap.png');
var material = new THREE.MeshStandardMaterial({ normalMap: normalMap });

对比两个地球的渲染效果,一个设置法线贴图,一个不设置法线贴图:

image.png

2. 凹凸贴图

凹凸贴图或位移贴图能够改变模型表面的几何形状,以模拟出更复杂的表面细节。凹凸贴图中的每个像素值代表了对应表面位置的位移量,渲染时,这个位移量会被添加到模型的顶点位置,从而改变模型的表面形状。

在Three.js中,可以使用MeshStandardMaterialMeshPhongMaterialdisplacementMap属性来指定凹凸贴图:

var displacementMap = new THREE.TextureLoader().load('textures/displacementMap.png');
var material = new THREE.MeshStandardMaterial({ displacementMap: displacementMap });

对比两面墙的渲染效果,一个使用凹凸贴图,一个不使用凹凸贴图:

image.png

3. 高光贴图

高光贴图用于控制模型表面的高光效果,它可以模拟出模型表面的不同材质,如金属、塑料等。高光贴图中的每个像素值代表了对应表面位置的高光强度,渲染时,这个值会影响光线的反射效果。

在Three.js中,可以使用MeshPhongMaterialspecularMap属性来指定高光贴图:

var specularMap = new THREE.TextureLoader().load('textures/specularMap.png');
var material = new THREE.MeshPhongMaterial({ specularMap: specularMap });

image.png

4. 环境贴图

环境贴图(Environment Maps),也常被称为反射贴图或天球贴图,是一种可以模拟环境反射效果的纹理。环境贴图通常是一个包含了全景环境图像的立方体纹理,渲染时,会根据模型的反射方向和环境贴图进行采样,从而模拟出环境反射的效果。

在Three.js中,可以使用MeshStandardMaterialMeshPhongMaterialenvMap属性来指定环境贴图:

var envMap = new THREE.CubeTextureLoader().load(['textures/envMap_px.png','textures/envMap_nx.png','textures/envMap_py.png','textures/envMap_ny.png','textures/envMap_pz.png','textures/envMap_nz.png'
]);
var material = new THREE.MeshStandardMaterial({ envMap: envMap });

image.png

5. 数据纹理

数据纹理(Data Textures)是一种特殊的纹理,它不是用于直接渲染的,而是用于存储一些数据,这些数据可以在着色器中使用,以实现一些复杂的图形处理效果。

数据纹理中的每个像素都可以存储一个RGBA值,这四个值可以分别代表不同的数据。在Three.js中,可以使用THREE.DataTexture类来创建数据纹理:

//程序生成一张图片的RGB值
var geometry = new THREE.PlaneGeometry(128, 128); //矩形平面
/*** 创建纹理对象的像素数据*/
var width = 32; //纹理宽度
var height = 32; //纹理高度
var size = width * height; //像素大小
var data = new Uint8Array(size * 3); //size*3:像素在缓冲区占用空间
for (let i = 0; i < size * 3; i += 3) {// 随机设置RGB分量的值data[i] = 255 * Math.random()data[i + 1] = 255 * Math.random()data[i + 2] = 255 * Math.random()
}
// 创建数据文理对象   RGB格式:THREE.RGBFormat
var texture = new THREE.DataTexture(data, width, height, THREE.RGBFormat);
texture.needsUpdate = true; //纹理更新
//打印纹理对象的image属性
// console.log(texture.image);
​
var material = new THREE.MeshPhongMaterial({map: texture, // 设置纹理贴图
}); //材质对象Material
var mesh = new THREE.Mesh(geometry, material);

image.png

附送250套精选项目源码

源码截图

 源码获取:关注公众号「码农园区」,回复 【源码】,即可获取全套源码下载链接

这篇关于【Three.js】知识梳理十一:Three.js高级纹理类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054656

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET