# 着色器
本指南将帮助你开始在 TresJS 中使用着色器。
我们将构建一个带有 blob 的简单场景。然后,我们将对 blob 进行动画处理,使其柔和地扭曲。
::: warning
_需要了解着色器工作原理的基本知识_
:::
## 设置场景(可选)
我们导入所需的所有模块,为了方便,我们可以使用 cientos 中的轨道控件,[点击此处查看方法](/zh/cookbook/orbit-controls)。
现在,我们将相机放在 `[11,11,11]` 位置。
最后,为了帮助我们确定位置,我们添加一个简单的平面,绕 X 轴旋转,单位为 `[10, 10]`。
```vue
```
## ShaderMaterial
如你所知,[ThreeJs](https://threejs.org/) 中的每个实例都可以在 **TresJs** 中使用,`ShaderMaterial` 也是如此,我们只需要添加 `Tres` 前缀即可使用它。
对于我们的 blob ,我们可以使用简单的 `SphereGeometry`,添加一些 `widthSegments` 和 `heightSegments` 来创建平滑效果,并将 blob 放在 Y 轴正方向的 4 个单位处
```vue
```
`ShaderMaterial` 接受特殊属性,如 `uniforms` `vertexShader` 和 `fragmentShader`,因此我们可以在脚本部分创建它,并与我们的实例进行绑定。
对于此示例,我们的 uniforms 如下所示:
```ts
import { Vector2 } from 'three'
// ...
const uniforms = {
uTime: { value: 0 },
uAmplitude: { value: new Vector2(0.1, 0.1) },
uFrequency: { value: new Vector2(20, 5) },
}
// ..
```
我们的片段着色器如下所示:
```ts
// ...
const fragmentShader = `
precision mediump float;
varying vec2 vUv;
void main() {
gl_FragColor = vec4(1.0, vUv.y, 0.5, 1.0);
}
`
// ..
```
最后是我们的顶点着色器:
```ts
const vertexShader = `
uniform vec2 uAmplitude;
uniform vec2 uFrequency;
uniform float uTime;
varying vec2 vUv;
void main() {
vec4 modelPosition = modelMatrix * vec4(position, 1.0);
modelPosition.y += sin(modelPosition.x * uFrequency.x - uTime) * uAmplitude.x;
modelPosition.x += cos(modelPosition.y * uFrequency.y - uTime) * uAmplitude.y;
vec4 viewPosition = viewMatrix * modelPosition;
gl_Position = projectionMatrix * viewPosition;
vUv = uv;
}
`
// ..
```
## 为 blob 添加动画
类似于我们在 [基本动画](/zh/cookbook/basic-animations) 示例中学习到的,我们首先使用 [模板引用](https://cn.vuejs.org/guide/essentials/template-refs.html) 引用 blob
```vue
```
获得引用后,我们可以使用 `onLoop` 回调为 `uTime` 添加动画。
```ts
import { TresCanvas, useRenderLoop } from '@tresjs/core'
// ...
const { onLoop } = useRenderLoop()
onLoop(({ elapsed }) => {
if (blobRef.value) {
blobRef.value.material.uniforms.uTime.value = elapsed
}
})
// ...
```
就这样,我们的基本着色器顺利运行。
## 使用 GLSL vite 插件(可选)
_此步骤完全是可选的,并且超出了 **TresJs** 团队的范围_
将着色器定义为内联形式并不总是最好的主意,但是如果你正在使用 [vite](https://vitejs.dev/),你可以通过使用 [vite-plugin-glsl](https://www.npmjs.com/package/vite-plugin-glsl) 将你的 `GLSL` 文件放在另一个文件中(查看链接以获取官方文档)。
你可以拥有类似于这样的结构:
```
├── src/
│ ├── myTresJsComponent.vue
│ ├── shaders/
│ ├── vertexShader.glsl
│ ├── fragmentShader.glsl
```