Three.js材质Material类型示例详解

目录
  • 1. 什么是材质Material?
  • 2. 常见材质类型
    • 2.1 基础材质(MeshBasicMaterial)
    • 2.2 标准材质(MeshStandardMaterial)
    • 2.3 Lambert 材质(MeshLambertMaterial)
    • 2.4 Phong 材质(MeshPhongMaterial)
    • 2.5 可编程着色器材质(ShaderMaterial)
  • 3. 纹理映射
  • 4.材质的主要属性
  • 5. 总结

1. 什么是材质Material?

在 Three.js 中,材质(Material)定义了物体表面的外观。它们决定了物体的颜色、纹理、光滑度、透明度等特性。你可以将材质理解为场景中物体的皮肤。Three.js 提供了多种材质类型,以满足不同场景的需求。

2. 常见材质类型

为了方便开发,Threejs提供了一系列的材质,所有材质就是对WebGL着色器代码的封装。

2.1 基础材质(MeshBasicMaterial)

基础材质是最简单的材质类型,它不受光照影响。适用于创建不需要光照效果的物体,例如背景、2D 图形等。它的参数包括颜色、透明度、贴图等。

const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });

2.2 标准材质(MeshStandardMaterial)

标准材质是一种具有真实感的材质类型。它考虑了光照、漫反射、镜面反射等效果。适用于创建具有现实感的物体。常用参数包括颜色、金属度、粗糙度等。

const material = new THREE.MeshStandardMaterial({ color: 0xff0000, metalness: 0.5, roughness: 0.5 });

2.3 Lambert 材质(MeshLambertMaterial)

Lambert 材质是一种简化的光照模型,它仅考虑漫反射效果。相比于标准材质,性能开销较小,但效果较差。适用于对性能要求较高,但对效果要求较低的场景。常用参数包括颜色、透明度等。

const material = new THREE.MeshLambertMaterial({ color: 0xff0000 });

2.4 Phong 材质(MeshPhongMaterial)

Phong 材质是一种更复杂的光照模型,它同时考虑了漫反射和镜面反射效果。相比于 Lambert 材质,效果较好,但性能开销较大。适用于对效果要求较高的场景。常用参数包括颜色、镜面反射颜色、光滑度等。

const material = new THREE.MeshPhongMaterial({ color: 0xff0000, specular: 0xffffff, shininess: 30 });

2.5 可编程着色器材质(ShaderMaterial)

可编程着色器材质允许开发者自定义着色器(GLSL 代码),实现独特的渲染效果。这种材质类型适用于具有特殊需求的场景。它需要开发者编写顶点着色器和片元着色器。

const vertexShader = `
  varying vec3 vWorldPosition;
  void main() {
    vec4 worldPosition = modelMatrix * vec4(position, 1.0);
    vWorldPosition = worldPosition.xyz;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
  }
`;

const fragmentShader = `
  varying vec3 vWorldPosition;
  void main() {
    vec3 color = vec3(vWorldPosition.x, vWorldPosition.y, vWorldPosition.z);
    gl_FragColor = vec4(color, 1.0);
  }
`;

const material = new THREE.ShaderMaterial({
  vertexShader: vertexShader,
  fragmentShader: fragmentShader,
});

3. 纹理映射

Three.js 支持为材质添加纹理,以实现更丰富的表面细节。纹理映射(Texture Mapping)是将一张 2D 图像贴到物体表面的技术。常见的纹理类型有:

  • 贴图(Texture):为物体添加颜色和细节。
  • 法线贴图(Normal Map):在不增加几何体细节的情况下,增强物体表面的凹凸感。
  • 环境光遮蔽贴图(Ambient Occlusion Map):增加物体表面的阴影效果,增强真实感。
  • 位移贴图(Displacement Map):根据纹理信息改变物体表面的几何细节。

4.材质的主要属性

在 Three.js 中,材质(Material)负责定义物体表面的外观,如颜色、纹理和光照效果。以下是一些主要的材质属性:

  • color: 基本颜色,通常是一个 THREE.Color 对象,表示材质的漫反射颜色。
  • map: 纹理贴图,是一个 THREE.Texture 对象,用于为材质添加纹理。
  • opacity: 透明度,表示材质的不透明程度,取值范围为 0(完全透明)到 1(完全不透明)。
  • transparent: 布尔值,指示材质是否透明。如果设置为 true,则材质将考虑透明度(opacity)的影响。
  • alphaMap: 透明度贴图,是一个 THREE.Texture 对象,用于根据纹理图像的灰度值控制材质的透明度。
  • side: 渲染面的方向,可以是 THREE.FrontSideTHREE.BackSideTHREE.DoubleSide。默认值是 THREE.FrontSide,只渲染正面。
  • emissive: 自发光颜色,通常是一个 THREE.Color 对象,表示材质的自发光颜色。
  • emissiveMap: 自发光贴图,是一个 THREE.Texture 对象,用于为材质添加自发光效果。
  • specular: 镜面反射颜色,通常是一个 THREE.Color 对象,表示材质的镜面反射颜色。这个属性主要应用于具有镜面反射效果的材质,如 THREE.MeshPhongMaterial
  • shininess: 光泽度,表示材质的光泽程度。这个属性主要应用于具有镜面反射效果的材质,如 THREE.MeshPhongMaterial
  • wireframe: 布尔值,指示是否以线框模式渲染物体。如果设置为 true,则物体将以线框模式显示。
  • bumpMap: 凹凸贴图,是一个 THREE.Texture 对象,用于为材质添加凹凸效果,以模拟表面的细微凹凸。
  • normalMap: 法线贴图,是一个 THREE.Texture 对象,用于为材质添加法线贴图效果,以模拟表面的细节。
  • displacementMap: 位移贴图,是一个 THREE.Texture 对象,用于根据纹理图像的灰度值改变物体表面的高度。
  • roughness: 粗糙度,表示材质表面的粗糙程度。这个属性主要应用于基于物理的渲染(PBR)材质,如 THREE.MeshStandardMaterialTHREE.MeshPhysicalMaterial
  • metalness: 金属度,表示材质表面的金属质感。这个属性主要应用于基于物理的渲染(PBR)材质,如 THREE.MeshStandardMaterialTHREE.MeshPhysicalMaterial
  • roughnessMap: 粗糙度贴图,是一个 THREE.Texture 对象,用于根据纹理图像的灰度值控制材质的粗糙度。这个属性主要应用于基于物理的渲染(PBR)材质。
  • metalnessMap: 金属度贴图,是一个 THREE.Texture 对象,用于根据纹理图像的灰度值控制材质的金属度。这个属性主要应用于基于物理的渲染(PBR)材质。
  • envMap: 环境贴图,是一个 THREE.Texture 对象,用于为材质添加反射和折射效果。
  • refractionRatio: 折射率,表示材质的折射程度。这个属性主要应用于具有折射效果的材质,如 THREE.MeshPhysicalMaterial

5. 总结

Three.js 提供了丰富的材质类型和纹理映射功能,帮助开发者创建出具有真实感和丰富细节的 3D 场景。从简单的基础材质到复杂的可编程着色器材质,你可以根据项目需求选择合适的材质类型。

以上就是Three.js材质Material的详细内容,更多关于Three.js材质Material的资料请关注我们其它相关文章!

(0)

相关推荐

  • Three.js PBR物理渲染属性及使用介绍

    目录 详解 Three.js PBR 物理渲染 什么是 PBR? 如何启用 PBR? PBR 的属性 颜色(color) 金属度(metalness) 粗糙度(roughness) 折射率(refractionRatio) 透明度和透明度映射 环境映射(environmentMap) 总结 详解 Three.js PBR 物理渲染 Three.js 是一个流行的基于 WebGL 的 JavaScript 库,专门用于创建和运行三维动画和游戏.其中很关键的一部分是物理渲染(PBR).本文将深入探讨

  • Three.js 中的屏幕空间环境光遮蔽SSAO

    目录 简介 原理 实现 总结 简介 在计算机图形学中,环境光遮蔽(Ambient Occlusion)是一种可以增强场景深度感.模拟阴影效果的技术.在 Three.js 中,我们可以使用屏幕空间环境光遮蔽(Screen Space Ambient Occlusion,简称 SSAO)来实现这个效果.本篇文章将详细介绍 SSAO 技术的原理和在 Three.js 中的应用. 原理 SSAO 技术是基于屏幕空间的,即只需要对当前帧进行处理,而不需要重新渲染场景.它的基本思想是根据场景中各个像素点周围

  • Three.js中实现Bloom效果及完整示例

    目录 在 Three.js 中实现 Bloom 效果 准备工作 实现 Bloom 效果 完整代码 结论 在 Three.js 中实现 Bloom 效果 Bloom 是一种常用于游戏和电影场景中的后期特效,用于模拟相机透镜光晕的效果.它可以使图像看起来更加真实.生动,并且增强视觉体验.在 Three.js 中,我们可以使用 UnrealBloomPass 和 ShaderPass 来实现这个效果.本文将介绍如何实现一个简单的 Bloom 效果. 准备工作 首先,我们需要引入 Three.js 库:

  • Three.js概述和基础知识学习

    目录 1.Three.js简介 2.Three.js的历史 3.Three.js的应用 4.基础知识 4.1 场景(Scene) 4.2 相机(Camera) 4.3 渲染器(Renderer) 4.4 几何体(Geometry) 4.5 材质(Material) 4.6 网格(Mesh) 4.7 光源(Light) 5.总结 1.Three.js简介 Three.js是一个基于JavaScript编写的开源3D图形库,利用WebGL技术在网页上渲染3D图形.它提供了许多高级功能,如几何体.纹理

  • java开发ShardingSphere的路由引擎类型示例详解

    目录 ShardingSphere的路由引擎类型 路由引擎类型 标准路由 路由逻辑 总结 ShardingSphere的路由引擎类型 本篇文章源码基于4.0.1版本 上篇文章我们了解到了ShardingSphere在路由流程过程中,根据不同类型的SQL会现在不同的路由引擎,而ShardingSphere支持的路由规则也很多了,包括广播(broadcast)路由.混合(complex)路由.默认数据库(defaultdb)路由.无效(ignore)路由.标准(standard)路由以及单播(uni

  • Fabric.js 实现变换视窗示例详解

    目录 引言 viewportTransform 缩放 斜切 平移 setViewportTransform(vpt) 引言 fabric.js 可以通过 viewportTransform 属性配置画布的视窗属性. 听上去很高级的样子,但其实这是原生 canvas 就已经存在的东西,fabric.js 的 viewportTransform 也就直接复用了原生 canvas 的 transform() . fabric.js 官方文档上也是这么说的 viewportTransform :Arra

  • js 实现验证码输入框示例详解

    目录 前言 思路 遇到的问题 HTML CSS JS 前言 验证码输入框应该是很常见的需求吧,不知道各位小伙伴在在遇到的时候是选择找一找插件还是自己动手撸一个呢?我花了点时间撸了一个出来,实际体验还不错,分享给大家. 思路 我在实现之前肯定也是上网搜了一下的,网上的方式大多是使用多个input标签来实现,但我觉得不太优雅,就自己想了一个方法.使用了6个div标签和一个input标签.验证码长度一般是4位或6位,我这里用6位做演示. 先将6个div使用flex布局平铺. 再将input使用绝对定位

  • C++20中的结构化绑定类型示例详解

    目录 C++20中新增了一个非常有用的特性 结构化绑定概念 结构化绑定类型 数组 Pair 结构体 实现一个可以被结构化绑定的类元组类型 C++20中新增了一个非常有用的特性 结构化绑定(Structured Binding).它可以让我们方便地从一个容器类型中取出元素并绑定到对应的变量中,使得代码更加简洁.易读.接下来,本文将分别介绍结构化绑定的概念.类型以及如何实现一个可以被结构化绑定的类元组类型. 结构化绑定概念 结构化绑定是C++20中的一个语言特性,允许将一个结构体或者其他类似类型的容

  • Python中的类与类型示例详解

    1.经典类与新式类 在了解Python的类与类型前,需要对Python的经典类(classic classes)与新式类(new-style classes)有个简单的概念. 在Python 2.x及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的特性:反之,即不由任意内置类型派生出的类,则称之为"经典类". "新式类"和"经典类"的区

  • sql – Oracle中匿名TABLE/VARRAY类型示例详解

    前言 本文主要介绍的是关于sql Oracle匿名TABLE/VARRAY类型的相关内容,在Oracle中,我有时会创建一些这样的结构 SELECT * FROM TABLE(STRINGS('a', 'b', 'c')) SELECT * FROM TABLE(NUMBERS(1, 2, 3)) 显然,我可以为上述声明我自己的类型.我可以在TABLE和VARRAY之间进行选择.例如: CREATE TYPE STRINGS AS TABLE OF VARCHAR2(100); CREATE T

  • vue+three.js实现炫酷的3D登陆页面示例详解

    目录 前言: Three.js的基础知识 关于场景 关于光源 关于相机(重要) 关于渲染器 完善效果 创建一个左上角的地球 使地球自转 创建星星 使星星运动 创建云以及运动轨迹 使云运动 完成three.js有关效果 结语 前言: 大家好,我是xx传媒严导(xx这两个字请自行脑补) . 该篇文章用到的主要技术:vue3.three.js 我们先看看成品效果: 高清大图预览(会有些慢): 座机小图预览: 废话不多说,直接进入正题 Three.js的基础知识 想象一下,在一个虚拟的3D世界中都需要什

  • Three.js实现雪糕地球的使用示例详解

    目录 前言 ThreeJS 基础——实现转动的球体 ThreeJS 纹理——实现转动的地球 交互式雪糕地球 添加 loading 效果 前言 最近的天气有几分酷热,去实验室的道路也有几分漫长,走着走着,小包感觉灵魂已经被热出窍了.回到实验室,把空调打开,雪糕吃上,静坐了几分钟,才重新感觉到灵魂的滋味,葛优躺在实验室的小床上,思维开始天马行空,世上有一万种方式能让小包凉快,但地球母亲呐,她却日渐炎热,谁能来给她降降温? 躺着躺着,进入了梦乡,小包梦到未来有一天,人类超级发达,可以穿梭时空,但发展的

  • Three.js引入Cannon.js及使用示例详解

    目录 引言 大体代码及效果 Cannon.js 打造当前 UI 引言 在开始之前,我们还是要解释下什么是 Cannon.js 以及它的作用. Cannon.js 是一个 3D 物理引擎,通过为物体赋予真实的物理属性的方式来计算运动.旋转和碰撞检测.Cannon.js 相较于其他常见的物理引擎来说,比较轻量级而且完全通过 JavaScript 来实现. Cannon.js 的官方文档地址为 schteppe.github.io/cannon.js/ ,从官方介绍中也可以看到很多有趣的例子,如下所示

  • JS中原始值和引用值的储存方式示例详解

    在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfined 引用值指的是复合数据类型的值,包括:Object.Function.Array.Date.RegExp 根据数据类型不同,有的变量储存在栈中,有的储存在堆中.具体区别如下: 原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始

随机推荐