【ThreeJS基础教程-材质纹理篇】3.3 立方纹理(天空盒),基础网格材质StandardMaterial进阶

学习ThreeJS的捷径

本段内容会写在0篇以外所有的,本人所编写的Threejs教程中

对,学习ThreeJS有捷径
当你有哪个函数不懂的时候,第一时间去翻一翻文档
当你有哪个效果不会做的时候,第一时间去翻一翻所有的案例,也许就能找到你想要的效果
最重要的一点,就是,绝对不要怕问问题,越怕找找别人问题,你的问题就会被拖的越久

如果你确定要走WebGL/ThreeJS的开发者路线的话,以下行为可以让你更快的学习ThreeJS

  1. 没事就把所有的文档翻一遍,哪怕看不懂,也要留个印象,至少要知道Threejs有什么
  2. 没事多看看案例效果,当你记忆的案例效果足够多时,下次再遇到相似问题时,你就有可能第一时间来找对应的案例,能更快解决你自己的问题
  3. 上述案例不只是官网的案例,郭隆邦技术博客,跃焱邵隼,暮志未晚等站点均有不少优质案例,记得一并收藏
    http://www.yanhuangxueyuan.com/ 郭隆邦技术博客
    https://www.wellyyss.cn/ 跃焱邵隼
    http://www.wjceo.com/ 暮志未晚
    这三个站点是我最常逛的站点,推荐各位有事没事逛一下,看看他们的案例和写法思路,绝对没坏处

立方纹理CubeTexture

立方纹理简介

在开这一篇之前,要先讲一讲立方纹理

在这里插入图片描述
在这里插入图片描述

上图是一个BoxGeometry的展开图,以及一张随手百度到的天空盒的图片

展开图有很多种,这里不是数学课就以这个为例

如上图的这样的纹理,被贴到盒子6个面的纹理,被称为 立方纹理CubeTexture

立方纹理的官方文档

在这里插入图片描述
立方纹理及其简单,就是一套由6张图组成的图片包,这个纹理可以被贴到立方体的六个面,所以我们又有个说法叫它天空盒,而我们使用的图片组合,有时候也被称为全景图,threejs中给的比较官方的名称为立方纹理

threejs官方的CubeTexture案例

立方纹理小案例

这里我们以官方的素材在这里开一个简单的案例
在这里插入图片描述
一般来说,我们要想让立方纹理完美拼合,threejs有如下加载规则

threeJS中天空盒加载顺序 px,nx,py,ny,pz,nz 或 left,right,top,bottom,front,back

在这里插入图片描述
一般提供全景图片全景照片的人,都会刻意标注出来每张图的位置

threejs加载这些图片也极其简单
在这里插入图片描述
我的文件结构如上

   function addMesh(){
        let loader = new THREE.CubeTextureLoader();
        //设置加载图片组的路径
        loader.setPath('./Park2/');
        //threeJS中天空盒加载顺序  px,nx,py,ny,pz,nz 或 left,right,top,bottom,front,back
        //一定要按顺序加载,否则会出现严重的拼合错误问题
        loader.load([
            "posx.jpg",
            "negx.jpg",
            "posy.jpg",
            "negy.jpg",
            "posz.jpg",
            "negz.jpg",
        ],(texture)=>{
            scene.background = texture;
        });
    }

案例效果
在这里插入图片描述

scene.background 可以允许使用立方纹理,这样我们生成的背景将具有很强的立体感

立方纹理常见错误

如果你的图片没有按顺序加载,大概率就会出现像下面这样的拼合错误问题,包括输出全景图的人命名不规范也会造成相关的问题
在这里插入图片描述

StandardMaterial常用属性

1. 环境贴图EnvMap

EnvMap官方解释

在这里插入图片描述
这里的环境贴图的属性,虽然要求是一个Texture,但是我们一般使用的时候,都尽量使用CubeTexture而非常规的Texutre

在文档中查看envMap的演示效果

StandardMaterial官方文档中,我们看到其中有一个属性envMaps
在这里插入图片描述

但是设置它似乎没有什么作用,当我们把roughness拉到0,metalness拉到1时,出现了很明显的效果
在这里插入图片描述
这里面出现了镜面的效果吗?不是,这里仅仅反射的是 CubeTexture

这里使用的全景图,可以在这个案例中看到效果官方的CubeMap演示

然后我们把颜色拉到白色时,我们就能看到比较清晰的全景图
在这里插入图片描述
想要给你的材质添加这种反射效果,也很简单

案例代码

    function addMesh(){
        let loader = new THREE.CubeTextureLoader();
        loader.setPath('./Park2/');
        //threeJS中天空盒加载顺序  px,nx,py,ny,pz,nz 或 left,right,top,bottom,front,back
        loader.load([
            "posx.jpg",
            "negx.jpg",
            "posy.jpg",
            "negy.jpg",
            "posz.jpg",
            "negz.jpg",
        ],(texture)=>{
            let material = new THREE.MeshStandardMaterial({
                roughness:0,
                metalness:0.5,
                envMap:texture //创建完立方纹理后,作为StandardMaterial的envMap来使用
            });
            let geometry = new THREE.BoxGeometry(100,1,1);
            let mesh = new THREE.Mesh(geometry,material);
            scene.add(mesh);
			
            scene.background = texture;
        });
    }

案例效果
在这里插入图片描述
接下来就请各位自行研究,看看调整Roughness和Metalness对envMap的影响

2. 法线贴图NormalMap

法线贴图官方介绍

在这里插入图片描述
简单说,我们看到的很多效果,其实并不是建模的细节有多么精致,而是法线贴图在帮忙

法线贴图展示

我们以官方的这个案例为例https://threejs.org/examples/#webgl_nodes_materials_physical_clearcoat
在这里插入图片描述
尤其是左下角的这个白色的球,我们看到了很多很多的小坑,但是这些小坑并非是因为模型就是这样,因为法线贴图改变了它的光照
在这里插入图片描述

官方的案例源码指引了资源的位置
在这里插入图片描述
这个就是这个球体的法线贴图,有没有觉得单独看贴图都有不错的立体感呢?

如何获取法线贴图

一般来讲,法线贴图都是由建模师提供

关于法线贴图的具体制作方式,请自行决定是否要去了解与学习

笔者这里仅建议了解清楚法线贴图是什么用途即可

法线贴图案例

    let scene,renderer,camera,orbitControls;
    function init(){
        scene = new THREE.Scene();
        renderer = new THREE.WebGLRenderer({
            alpha:true,
            antialias:true
        });
        renderer.setSize(window.innerWidth,window.innerHeight);
        document.body.appendChild(renderer.domElement);
        camera = new THREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,0.01,50000);
        camera.position.set(10,10,10);
        orbitControls = new OrbitControls(camera,renderer.domElement);

		//由于法线贴图是受光照影响的,所以我们这里需要添加相机灯
        camera.add(new THREE.PointLight());
        scene.add(camera);
        
        let helper = new THREE.GridHelper(50,10);
        scene.add(helper);

    }
    function addMesh(){

        let textureLoader = new THREE.TextureLoader();

        textureLoader.load('./golfball.jpg',(texture)=>{

            let geometry = new THREE.SphereGeometry(5,32,32);
            let material = new THREE.MeshStandardMaterial({
                normalMap:texture
            });
            let mesh = new THREE.Mesh(geometry,material);
            scene.add(mesh);
        })
    }
    function render(){
        renderer.render(scene,camera);
        requestAnimationFrame(render);
    }

在这里插入图片描述
代码和上面的envMap一样,特别简单,但是由于添加了法线贴图,使得球体的立体感直线上升

通过修改法线贴图强度来调整立体感

同时我们可以通过控制法线贴图的影响比例,来调整法线贴图的效果强度

在这里插入图片描述
注意,normalScale是一个vector2对象,也就是说我们需要同时设置x和y的值才能生效

	        let material = new THREE.MeshStandardMaterial({
                normalMap:texture
            });
			//创建材质后,将法线贴图影响降低到0.1
            material.normalScale.set(0.1,0.1);

修改结果
在这里插入图片描述
我们依然能看到一些细节,但是已经不如之前那么强烈了,更像是一个被磨平的球

3. 放射光Emissive

Emissive,自发光,放射光,发光效果的纠正

先纠正一点,Emissive也有翻译为自发光 ,但是自发光发光效果是两码事,非常非常多的人把自发光理解为了发光效果,实际上我们常说的自发光,是指 放射光Emissive,而非发光效果
在这里插入图片描述
如上图这样的效果我们一般称为发光效果,所以在谈到自发光的时候,绝绝对对不要弄混了

放射光Emissive介绍

在这里插入图片描述
官方只是对这几个属性做了解释,根本没有讲清楚emissive和emissiveMap是干嘛的

我们在平时使用StandardMaterial的时候,需要使用光源,才能让材质达到一个最好的效果,因为StandardMaterial是对光源有反应的,如果我们本身让物体具有亮度呢?

emissive本质上是让这个材质本身具有发光的功能,使得我们不需要创建光源也能看到这个物体

放射光Emissive的简单案例

    function addMesh(){
            let geometry = new THREE.SphereGeometry(5,32,32);
            let material = new THREE.MeshStandardMaterial({
                emissive:"#ffffff",
                emissiveIntensity:0.5,
            });
            let mesh = new THREE.Mesh(geometry,material);
            scene.add(mesh);
    }

这样创建的StandardMaterial,即使你的场景中没有光源,它依然能够被看到

emissive是它本身的光的颜色,一般默认是黑色,因为正常情况下我们使用StandardMaterial都是会添加光源的,所以这里必须为黑色,这里的颜色最终也会参与到颜色计算,一般我们都用白色或黑色

emissive可以理解为不需要光照的 color属性

emissiveMap是 放射光/自发光 贴图,这里的贴图可以理解为,不需要光照的map属性,属性值是一个常规Texture对象,基本上和map一样,不需要做像法线贴图那样的特殊处理

4. 其他贴图

关于Standard材质的文档中,还有好几个贴图笔者在这里就不做过多介绍了,很少有用到,如果你们合作的建模师是那种非常专业级的,那么很多的问题可以完全可以用贴图来解决

比如说:
处理透明度的alphaMap,
处理环境遮挡效果的aoMap,
创建凹凸效果的bumpMap
无需光源就能被看到的emissiveMap
无需光照就能反馈光照效果的lightMap
处理金属度的metalnessMap
处理粗糙度的roughnessMap

如果一个模型把上述的贴图全部都包含了,那么我们也无需对场景和模型做太多处理,全部直接导入就能看到比较好的效果了

关于 Standard材质与其他材质

Standard材质用途极其广泛

以笔者的经历来说,Standard材质可以说是Threejs的重中之重,几乎所有好看的效果,都是基于StandardMaterial,包括效果更好的MeshPhysicalMaterial,都是基于StandardMaterial的基础上开发的

建模软件里的标准材质,也基本都是对应Threejs中的StandardMaterial

Standard难在经验而非理解

这个材质其实属性就那么点,但是想用这个材质做出好看的效果,不仅需要你靠着大量的调整数据,增加贴图之类的操作积累经验,背后还需要有一个强力的美术工作者来提供好看的设计方案与贴图

其他材质的简单介绍

在这里插入图片描述
官方共计提供了18种材质,除去超类Material共计17种,这里对这些材质做简单介绍

Line材质

LineBasic和LineDashed在后面讲解线条的时候讲解,难度极低

Basic材质

Basic材质主要用于创建完全不受光照影响,然后又不需要好看的效果的物体,比如说指向用的箭头

Lambert材质

Lambert材质在做粗糙度物体上比较有优势,如果你的场景中元素特别多,而且都是粗糙的物体,需要从材质角度来优化的话,可以选择不用Standard材质,替换为Lambert材质
官方也特意解释了:

Normal材质

这个材质笔者仅在做案例时用过一次,除了做彩虹这种五颜六色的东西,笔者想不到有什么东西能用到这个材质

Phong材质

低配版的Standard材质,计算量要比Standard要低,理解和学习难度也比Standard材质要低

部分FBX格式的模型,导入到threejs中,会被创建为Phong材质,如果你的项目规定必须用FBX格式,可以自行了解一下这个材质

Physical材质

高配版的Standard材质,如果你需要你的项目效果更好,可以使用这个来替代Standard材质

Toon材质

卡通材质,感觉更像是官方开发着玩的材质,因为看起来非常有绘画和卡通的感觉

Points和Sprite材质

后续在讲到粒子效果精灵时会着重讲解

Shadow材质

专门用于接收阴影的材质,不接收阴影时材质显示为纯透明,当你需要一个东西来接收阴影,但是你又不适合放一个实体的时候,可以使用这个材质

Shader材质和RawShader材质

这是整个Threejs最难的地方,Shader创建了threejs,threejs创建了ShaderMaterial来简化Shader的写法,已经对Shader做了简化,但是无法改变Shader本身难度过高的问题

Shader材质也是Threejs的重中之重,但是把它放到材质篇讲对于1~3年经验的threejs开发者来说又难度过高,笔者也只是刚刚入门的水平

所以关于这两种材质后续会有专门的文章着重讲解

其他材质

本文没有提到的材质,在笔者的3年经验中从未使用,不做讲解,有兴趣的可以自行学习和了解

下一篇预告

Standard材质简单应用

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录: 第Ⅰ部分 基础知识 必备的数学知识 3D空间中的向量 向量相等 计算向量的长度 向量的规范化 向量加法 向量减法 数乘 点积 叉积 矩阵 矩阵相等、矩阵数乘和矩阵加法 矩阵乘法 单位矩阵 逆矩阵 矩阵的转置 D3DX矩阵 基本变换 平移矩阵 旋转矩阵 比例变换矩阵 几何变换的组合 向量变换的一些函数 平面(选读) D3DXPLANE 点和平面的空间关系 平面的创建 平面的规范化 平面的变换 平面中到某一点的最近点 射线(选读) 射线 射线与平面的相交 小结    第Ⅱ部分 Direct3D基础 第1章 初始化Direct3D 1.1 Direct3D概述 1.1.1 REF设备 1.1.2 D3DDEVTYPE 1.2 COM(组件对象模型) 1.3 预备知识 1.3.1 表面 1.3.2 多重采样 1.3.3 像素格式 1.3.4 内存池 1.3.5 交换链和页面置换 1.3.6 深度缓存 1.3.7 顶点运算 1.3.8 设备性能 1.4 Direct3D的初始化 1.4.1 获取接口IDirect3D9的指针 1.4.2 校验硬件顶点运算 1.4.3 填充D3DPRESENT_PARAMETER结构 1.4.4 创建IDirect3DDevice9 接口 1.5 例程:Direct3D的初始化 1.5.1 d3dUtility.h/cpp 1.5.2 例程框架 1.5.3 例程:D3D初始化 1.6 小结 第2章 绘制流水线 2.1 模型表示 2.1.1 顶点格式 2.1.2 三角形单元 2.1.3 索引 2.2 虚拟摄像机 2.3 绘制流水线 2.3.1 局部坐标系 2.3.2 世界坐标系 2.3.3 观察坐标系 2.3.4 背面消隐 2.3.5 光照 2.3.6 裁剪 2.3.7 投影 2.3.8 视口变换 2.3.9 光栅化 2.4 小结 第3章 Direct3D中的绘制 3.1 顶点缓存与索引缓存 3.1.1 创建顶点缓存和索引缓存 3.1.2 访问缓存内容 3.1.3 获取顶点缓存和索引缓存的信息 3.2 绘制状态 3.3 绘制的准备工作 3.4 使用顶点缓存和索引缓存行绘制 3.4.1 IDirect3DDevice9::DrawPrimitive 3.4.2 IDirect3DDevice9::DrawIndexedPrimitive 3.4.3 Begin/End Scene 3.5 D3DX几何体 3.6 例程:三角形、立方体、茶壶、D3DXCreate* 3.7 小结 第4章 颜色 4.1 颜色表示 4.2 顶点颜色 4.3 着色 4.4 例程:具有颜色的三角形 4.5 小结 第5章 光照 5.1 光照的组成 5.2 材质 5.3 顶点法线 5.4 光源 5.5 例程:光照 5.6 一些附加例程 5.7 小结 第6章 纹理映射 6.1 纹理坐标 6.2 创建并启用纹理 6.3 纹理过滤器 6.4 多级渐纹理 6.4.1 多级渐纹理过滤器 6.4.2 使用多级渐纹理 6.5 寻址模式 6.6 例程:纹理四边形 6.7 小结 第7章 融合技术 7.1 融合方程 7.2 融合因子 7.3 透明度 7.3.1 Alpha通道 7.3.2 指定Alpha来源 7.4 用DirectX Texture Tool 创建Alpha通道 7.5 例程:透明效果 7.6 小结 第8章 模板 8.1 模板缓存的使用 8.1.1 模板缓存格式的查询 8.1.2 模板测试 8.1.3 模板测试的控制 8.1.4 模板缓存的更新 8.1.5 模板写掩码 8.2 例程:镜面效果 8.2.1 成像中的数学问题 8.2.2 镜面效果实现概述 8.2.3 代码解析 8.3 例程:Planer Shadows 8.3.1 平行光阴影 8.3.2 点光源产生的阴影 8.3.3 阴影矩阵 8.3.4 使用模板缓存防止二次融合 8.3.5 代码解析 8.4 小结 第Ⅲ部分 Direct3D的应用 第9章 字体 9.1 ID3DXFont接口 9.1.1 创建一个ID3DXFont 接口对象 9.1.2 绘制文本 9.1.3 计算每秒绘制的帧数 9.2 CD3DFont 9.2.1 创建CD3DFont类的实例 9.2.2 绘制文本 9.2.3 清理 9.3 D3DXCreateText函数 9.4 小结 第10章 网格(一) 10.1 几何信息 10.2 子集和属性缓存 10.3 绘制 10.4 网格优化 10.5 属性表 10.6 邻接信息 10.7 克隆 10.8 创建网格(D3DXCreateMeshFVF) 10.9 例程:网格的创建与绘制 10.10 小结 第11章 网格(二) 11.1 ID3DXBuffer 11.2 XFile 11.2.1 加载XFile文件 11.2.2 XFile材质 11.2.3 例程:XFile 11.2.4 生成顶点法线 11.3 渐网格 11.3.1 生成渐网格 11.3.2 顶点属性权值 11.3.3 ID3DXPMesh接口方法 11.3.4 例程:Progressive Mesh 11.4 外接体 11.4.1 一些新的特殊常量 11.4.2 外接体的类型 11.4.3 例程:Bounding Volumes 11.5 小结 第12章 设计一个灵活的Camera类 12.1 Camera类的设计 12.2 实现细节 12.2.1 观察矩阵(取景变换矩阵, View Matrix)的计算 12.2.2 绕任意轴的旋转 12.2.3 俯仰、偏航和滚动 12.2.4 行走、扫视和升降 12.3 例程:Camera 12.4 小结 第13章 地形绘制基础 13.1 高度图 13.1.1 创建高度图 13.1.2 加载RAW文件 13.1.3 访问和修改高度图 13.2 创建地形几何信息 13.2.1 顶点的计算 13.2.2 索引的计算 13.3 纹理映射 13.4 光照 13.4.1 概述 13.4.2 坐标方格的明暗度计算 13.4.3 对地形行着色 13.5 在地形中“行走” 13.6 例程:Terrain 13.7 一些改 13.8 小结 第14章 粒子系统 14.1 粒子和点精灵 14.1.1 结构格式 14.1.2 点精灵的绘制状态 14.1.3 粒子及其属性 14.2 粒子系统的组成 14.2.1 绘制一个粒子系统 14.2.2 随机性 14.3 具体的粒子系统 14.3.1 例程:Snow System 14.3.2 例程:Firework 14.3.3 例程:Particle Gun 14.4 小结 第15章 拾取 15.1 屏幕到投影窗口的变换 15.2 拾取射线的计算 15.3 对射线行变换 15.4 射线/物体相交判定 15.5 例程:Picking 15.6 小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值