第九章 Three.js 高级材质与着色器 (一)

ops/2024/9/23 11:13:11/

材质着色器在Three.js中扮演着至关重要的角色,它们决定了物体的外观和视觉效果。在本章中,我们将深入学习Three.js中的高级材质和自定义着色器,以创建复杂和精美的视觉效果。

9.1 基本材质回顾

在开始深入探讨高级材质之前,回顾一下Three.js提供的几种基本材质

  • MeshBasicMaterial: 不受光照影响的材质
  • MeshStandardMaterial: 基于物理的标准材质
  • MeshLambertMaterial: 具有漫反射光照效果的材质
  • MeshPhongMaterial: 具有高光反射效果的材质

9.2 使用纹理

纹理是将图像映射到几何体上的技术。Three.js中可以通过TextureLoader加载纹理,并将其应用到材质上。

示例代码:
javascript">// 创建一个场景
const scene = new THREE.Scene();// 创建一个相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.z = 5;// 创建一个渲染器并添加到HTML文档中
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 加载纹理
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('path/to/texture.jpg');// 创建带有纹理的材质
const material = new THREE.MeshBasicMaterial({ map: texture });// 创建一个立方体并应用材质
const geometry = new THREE.BoxGeometry();
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);// 渲染循环
function animate() {requestAnimationFrame(animate);cube.rotation.x += 0.01;cube.rotation.y += 0.01;renderer.render(scene, camera);
}
animate();

9.3 高级材质属性

Three.js中的高级材质MeshStandardMaterialMeshPhysicalMaterial提供了更多属性,可以实现更为复杂的效果。

示例代码:
javascript">// 加载纹理
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('path/to/texture.jpg');
const normalMap = textureLoader.load('path/to/normalMap.jpg');
const roughnessMap = textureLoader.load('path/to/roughnessMap.jpg');
const metalnessMap = textureLoader.load('path/to/metalnessMap.jpg');// 创建高级材质
const material = new THREE.MeshStandardMaterial({map: texture,normalMap: normalMap,roughnessMap: roughnessMap,metalnessMap: metalnessMap,roughness: 0.5,metalness: 0.8
});// 创建一个立方体并应用材质
const geometry = new THREE.BoxGeometry();
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);// 渲染循环
function animate() {requestAnimationFrame(animate);cube.rotation.x += 0.01;cube.rotation.y += 0.01;renderer.render(scene, camera);
}
animate();

http://www.ppmy.cn/ops/50695.html

相关文章

服务器新硬盘分区、格式化和挂载

文章目录 参考文献查看了一下起点现状分区(base) ~ sudo parted /dev/sdcmklabel gpt(设置分区类型)增加分区 格式化需要先退出quit(可以)(base) / sudo mkfs.xfs /dev/sdc/sdc1(失败)sudo mkfs.xfs /dev/s…

el-select filterable模糊搜索在iOS手机上无法弹出软键盘,解决方案

前提: el-select filterable模糊搜索在iOS手机上无法弹出软键盘,在手机上使用时,iOS手机,该组件无法唤起软键盘,导致没法进行模糊搜素。 于是。开始去找原因,发现主要是因为 组件中,input上有一…

【Python】一文向您详细解析内置装饰器 @lru_cache

【Python】一文向您详细解析内置装饰器 lru_cache 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕&a…

java设计模式和面向对象编程思想

Java设计模式和面向对象编程思想是软件开发中的核心概念,对于构建可维护、可扩展的软件系统至关重要。下面是对这两个主题的知识点总结: 面向对象编程(OOP)思想 封装:将数据(属性)和操作这些数据…

Go 基础丨字符串 string

1. 底层 runtime/string.go type stringStruct struct {str unsafe.Pointer // 指向底层 Byte 数组len int // String 所占字节数 }reflect/value.go type StringHeader struct {Data uintptrLen int }2. 测试 s_en : "hedonwang"s_cn : "王小佳"…

Gauss200使用分享

登录、授权控制 解锁账户 su - omm gsql -d db_rdb -p 8000 -ralter user ado_user account unlock; alter user sig_qry_rpt account unlock;参数控制 && 优化参考 只读模式解锁 su - omm gs_guc reload -Z coordinator -Z datanode -N all -I all -c "defau…

《米小圈动画汉字》动画化汉字教育:传统与创新的完美融合!

汉字,作为中华文化的瑰宝,承载着千百年来中华民族的智慧和思想。每一个汉字不仅仅是一个符号,更是一段历史的见证,一种文化的传承。然而,在当今全球化的背景下,汉字教育面临着新的挑战与机遇。在这种背景下…

Qt/C++ 序列化(protobuf方式)

一、序列化介绍 序列化是将需要的内存对象转换为字节流或者其他数据格式的过程,以便保存到文件或者传输。反序列化则是将数据还原到内存对象。 序列化后存档格式有二进制数据、XML或JSON文件等。可以按照自己的需求进行序列化。 二、protobuf介绍 Protocal Buffe…