index.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <script setup lang="ts">
  2. import { BasicShadowMap, sRGBEncoding, NoToneMapping, Vector2 } from 'three'
  3. import { TresCanvas, TresInstance, useRenderLoop } from '@tresjs/core'
  4. import { OrbitControls } from '@tresjs/cientos'
  5. import vertexShader from './shaders/vertex.glsl'
  6. import fragmentShader from './shaders/fragment.glsl'
  7. import { ShallowRef } from 'vue'
  8. const gl = {
  9. clearColor: '#4f4f4f',
  10. shadows: true,
  11. alpha: false,
  12. shadowMapType: BasicShadowMap,
  13. outputEncoding: sRGBEncoding,
  14. toneMapping: NoToneMapping,
  15. }
  16. const blobRef: ShallowRef<TresInstance | null> = shallowRef(null)
  17. const uniforms = {
  18. uTime: { value: 0 },
  19. uAmplitude: { value: new Vector2(0.1, 0.1) },
  20. uFrequency: { value: new Vector2(20, 5) },
  21. }
  22. const { onLoop } = useRenderLoop()
  23. onLoop(({ elapsed }) => {
  24. if (blobRef.value) {
  25. blobRef.value.material.uniforms.uTime.value = elapsed
  26. }
  27. })
  28. </script>
  29. <template>
  30. <TresCanvas v-bind="gl">
  31. <OrbitControls />
  32. <TresPerspectiveCamera :position="[11, 11, 11]" />
  33. <TresMesh ref="blobRef" :position="[0, 4, 0]">
  34. <TresSphereGeometry :args="[2, 32, 32]" />
  35. <TresShaderMaterial :vertex-shader="vertexShader" :fragment-shader="fragmentShader" :uniforms="uniforms" />
  36. </TresMesh>
  37. <TresMesh :rotation="[-Math.PI / 2, 0, 0]">
  38. <TresPlaneGeometry :args="[10, 10, 10, 10]" />
  39. <TresMeshBasicMaterial color="#444" />
  40. </TresMesh>
  41. <TresAmbientLight :intensity="1" />
  42. </TresCanvas>
  43. </template>