threejs 纹理流动_ThreeJs 认识纹理

一、前言

这篇文章,我们主要来了解一下 ThreeJs 中纹理相关的知识。渲染一个 3D 物体时,网格 Mesh 决定了这个物体的形状态,如一个球,一辆车,一个人等。而纹理决定了这个物体的表面具体长什么样子。一个球包上一层篮球的花纹就是篮球了,而如果包上的是一层足球的花纹那可能就是足球了。

二、概述

ThreeJs 中为定义了多种多样的纹理,其类图如下。

纹理的基类是 Texture,一般我们都使用这个类,通过给其属性 Image 传入一个图片从而构造出一个纹理。纹理是材质的属性,材质和几何体 Gemotry 构成 Mesh ,然后被添加到 Scene 中进行渲染。纹理决定了物体的表面该是什么样子,而材质则决定了物体具备什么样的“气质”。后面还会再专门学习材质,下面再详细地看一看各个纹理的作用及其使用场景。

三、认识纹理

1、Texture

纹理的属性何其多,但在一般情况下,并不要需要一一来设置,而是取默认值即可。并且,我们一般都会通过 TextureLoader 来为我们构造一个纹理,而不是直接构造。例子如下。

var texture = new THREE.TextureLoader().load( "textures/water.jpg" );

texture.wrapS = THREE.RepeatWrapping;

texture.wrapT = THREE.RepeatWrapping;

texture.repeat.set

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Three.js中的纹理流动效果,可以通过多重纹理和过程纹理来实现。 多重纹理可以用于在一个对象上同时应用多个纹理,比如可以在一个球体上同时应用地图纹理和云层纹理。在Three.js中,可以使用THREE.MeshPhongMaterial来实现多重纹理。具体实现步骤如下: 1. 创建多个纹理对象,例如地图纹理和云层纹理。 ``` const mapTexture = new THREE.TextureLoader().load('map.jpg'); const cloudTexture = new THREE.TextureLoader().load('cloud.jpg'); ``` 2. 创建多重纹理材质对象,并将纹理对象添加到材质中。 ``` const material = new THREE.MeshPhongMaterial({ map: mapTexture, specularMap: cloudTexture, specular: new THREE.Color('grey'), shininess: 50 }); ``` 3. 创建对象,并将多重纹理材质对象添加到对象中。 ``` const sphere = new THREE.Mesh(new THREE.SphereGeometry(5, 32, 32), material); scene.add(sphere); ``` 过程纹理可以用于在运行时生成纹理,可以用于创建流动的水面、火焰等效果。在Three.js中,可以使用THREE.WebGLRenderTarget和THREE.ShaderMaterial来实现过程纹理。具体实现步骤如下: 1. 创建WebGLRenderTarget对象,用于生成渲染目标,并设置其宽度和高度。 ``` const renderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight); ``` 2. 创建ShaderMaterial对象,并将renderTarget对象添加到uniforms中。 ``` const material = new THREE.ShaderMaterial({ uniforms: { texture: { value: renderTarget.texture } }, vertexShader: document.getElementById('vertexShader').textContent, fragmentShader: document.getElementById('fragmentShader').textContent }); ``` 3. 创建对象,并将ShaderMaterial对象添加到对象中。 ``` const plane = new THREE.Mesh(new THREE.PlaneBufferGeometry(50, 50), material); scene.add(plane); ``` 4. 在渲染时,先渲染到renderTarget上,然后将渲染结果应用到ShaderMaterial对象的纹理中。 ``` renderer.setRenderTarget(renderTarget); renderer.render(scene, camera); renderer.setRenderTarget(null); ``` 其中,vertexShader和fragmentShader分别为顶点着色器和片元着色器代码。可以在ShaderMaterial对象中直接使用字符串,也可以将代码放置在HTML中,并通过document.getElementById()方法获取。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值