먼저 다음처럼 drei의 shaderMaterial를 이용해 GLSL로 재질을 만들 수 있습니다.
import { shaderMaterial } from '@react-three/drei'
const WaveShaderMaterial = shaderMaterial(
{
uColor: new THREE.Color(1, 0, 0)
},
/* glsl */`
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
/* glsl */`
uniform vec3 uColor;
varying vec2 vUv;
void main() {
gl_FragColor = vec4(vUv.y * uColor, 1.0);
}
`
)
리엑트는 선언형 프로그래밍(?) 방식을 권장하므로 위에서 만든 WaveShaderMaterial을 Tag처럼 선언해서 사용할 수 있도록 해야 합니다. 이때 R3F의 extend가 사용됩니다.
import { Canvas, extend } from '@react-three/fiber'
extend({ WaveShaderMaterial })
실제 사용은 다음과 같습니다.
const MyCanvas = () => {
return (
<Canvas>
<pointLight position={[10,10,10]} />
<mesh>
<planeGeometry args={[5,5]} />
<waveShaderMaterial uColor={"white"} />
</mesh>
</Canvas>
)
}
function App() {
return (
<MyCanvas />
)
}
결과는 다음과 같습니다.

