Skip to content

加载纹理

本示例中使用的所有纹理均来自 ambientcg.

三维 (3D) 纹理是包含多个数据层的图像,可以表示体积或模拟三维结构。 这些纹理通常用于 3D 图形和视觉特效中,以增强场景和物体的真实感和复杂性。

在 TresJS 中加载 3D 纹理有两种方法:

使用 useLoader

组合式函数 useLoader 允许您传递任何类型的 three.js 加载器和加载资源的 URL。它会返回一个包含已加载资源的 Promise

有关如何使用 useLoader 的详细说明,请查看 useLoader 文档。

ts
import { useLoader } from '@tresjs/core'
import { TextureLoader } from 'three'

const texture = useLoader(TextureLoader, '/Rock035_2K_Color.jpg')

然后就可以将纹理传递给材质:

html
<Suspense>
  <TresCanvas>
    <TresMesh>
      <TresSphereGeometry :args="[1,32,32]" />
      <TresMeshStandardMaterial :map="texture" />
    </TresMesh>
  </TresCanvas>
</Suspense>

请注意在上面的示例中,我们使用 Suspense 组件包装 TresCanvas 组件。这是因为 useLoader 返回一个 Promise,我们需要等待它解析后才能渲染场景。

使用 useTexture

一种更方便的加载纹理的方式是使用 useTexture 组合式函数。它接受一个 URL 数组或一个具有映射纹理路径的单个对象。

要了解有关 useTexture 的更多信息,请查看 useTexture 文档。

ts
import { useTexture } from '@tresjs/core'

const pbrTexture = await useTexture({
  map: '/textures/black-rock/Rock035_2K_Displacement.jpg',
  displacementMap: '/textures/black-rock/Rock035_2K_Displacement.jpg',
  roughnessMap: '/textures/black-rock/Rock035_2K_Roughness.jpg',
  normalMap: '/textures/black-rock/Rock035_2K_NormalDX.jpg',
  aoMap: '/textures/black-rock/Rock035_2K_AmbientOcclusion.jpg',
  metalnessMap: '/textures/black-rock/myMetalnessTexture.jpg',
  matcap: '/textures/black-rock/myMatcapTexture.jpg',
  alphaMap: '/textures/black-rock/myAlphaMapTexture.jpg'
})

与前面的示例类似,我们可以通过 props 将所有纹理传递给材质:

html
<Suspense>
  <TresCanvas>
    <TresMesh>
      <TresSphereGeometry :args="[1,32,32]" />
      <TresMeshStandardMaterial
        :map="pbrTexture.map"
        :displacementMap="pbrTexture.displacementMap"
        :roughnessMap="pbrTexture.roughnessMap"
        :normalMap="pbrTexture.normalMap"
        :aoMap="pbrTexture.ambientOcclusionMap"
      />
    </TresMesh>
  </TresCanvas>
</Suspense>