Skip to content

Commit 942ca8d

Browse files
author
takuma-hmng8
committed
11.6
1 parent db79baf commit 942ca8d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+1158
-187
lines changed

CONTRIBUTING.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
コントリビュートするフロー
2+
3+
### fx を新しくつくる場合
4+
5+
- フォークする
6+
- 依存をインストール
7+
- ブランチを切ってください!
8+
- \_shaderFx/Create Kit を編集することができます。
9+
- gui の例や基本的なカスタムフックの構成など、ベースを用意しています。
10+
- useSample を編集して hook を作成してください!
11+
- できたら、PR!

CreateKit/config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const CONFIG = {
2+
sampleFx: {
3+
someValue: 0.0,
4+
},
5+
};

CreateKit/fxMaterial.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as THREE from "three";
2+
import vertexShader from "./shader/main.vert";
3+
import fragmentShader from "./shader/main.frag";
4+
import { shaderMaterial } from "@react-three/drei";
5+
6+
declare global {
7+
namespace JSX {
8+
interface IntrinsicElements {
9+
fxMaterial: any;
10+
}
11+
}
12+
}
13+
14+
export type TFxMaterial = {
15+
u_fx: THREE.Texture | null;
16+
};
17+
18+
export const FxMaterial = shaderMaterial(
19+
{
20+
u_fx: null,
21+
},
22+
vertexShader,
23+
fragmentShader
24+
);

CreateKit/index.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { useRef } from "react";
2+
import * as THREE from "three";
3+
import { useFrame, extend, useThree } from "@react-three/fiber";
4+
import { FxMaterial, TFxMaterial } from "./fxMaterial";
5+
import { usePerformanceMonitor } from "@react-three/drei";
6+
import { useGUI } from "./useGUI";
7+
import { CONFIG } from "./config";
8+
import { useSample } from "./useSample";
9+
10+
// dreiのshaderMaterialを使うことで、key={FxMaterial.key}を有効にすることができ、hotReloadが使えます。
11+
extend({ FxMaterial });
12+
13+
/**
14+
* 新しいFXを作成するためのシーンです。CONFIGのisCreateをtrueにすることで、development環境でのみレンダリングされます。
15+
*/
16+
export const CreateKit = () => {
17+
const updateGUI = useGUI();
18+
const fxRef = useRef<TFxMaterial>();
19+
20+
const size = useThree((state) => state.size);
21+
const dpr = useThree((state) => state.viewport.dpr);
22+
23+
const [updateSample, setSample, sampleObj] = useSample({ size, dpr });
24+
25+
// factorに応じたパフォーマンスコントロールを考慮して、setParams関数は作成してください。
26+
usePerformanceMonitor({
27+
onChange({ factor }) {
28+
setSample({ someValue: factor });
29+
},
30+
});
31+
32+
useFrame((props) => {
33+
const fx = updateSample(props, { someValue: CONFIG.sampleFx.someValue });
34+
fxRef.current!.u_fx = fx;
35+
updateGUI();
36+
});
37+
38+
return (
39+
<mesh>
40+
<planeGeometry args={[2, 2]} />
41+
<fxMaterial key={FxMaterial.key} ref={fxRef} />
42+
</mesh>
43+
);
44+
};

CreateKit/shader/main.frag

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
precision mediump float;
2+
varying vec2 vUv;
3+
uniform sampler2D u_fx;
4+
5+
void main() {
6+
vec2 uv = vUv;
7+
gl_FragColor = texture2D(u_fx, uv);
8+
}
File renamed without changes.

CreateKit/useGUI.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { useCallback, useEffect, useMemo } from "react";
2+
import { CONFIG } from "./config";
3+
import GUI from "lil-gui";
4+
5+
export const useGUI = () => {
6+
const gui = useMemo(
7+
() => new GUI({ closeFolders: true, title: "shader-fx" }),
8+
[]
9+
);
10+
11+
useEffect(() => {
12+
const sample = gui.addFolder("sample");
13+
sample.add(CONFIG.sampleFx, "someValue", 0, 1, 0.01);
14+
}, [gui]);
15+
16+
const updateDisplays = useCallback(() => {
17+
gui.folders.forEach((folder) =>
18+
folder.controllers.forEach((controller) => controller.updateDisplay())
19+
);
20+
}, [gui]);
21+
22+
return updateDisplays;
23+
};

CreateKit/useSample/index.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { useCallback, useMemo } from "react";
2+
import * as THREE from "three";
3+
import { useMesh } from "./useMesh";
4+
import { RootState, Size } from "@react-three/fiber";
5+
import {
6+
useCamera,
7+
usePointer,
8+
useSingleFBO,
9+
setUniform,
10+
useParams,
11+
} from "@/packages/use-shader-fx/src";
12+
import { HooksReturn } from "@/packages/use-shader-fx/types/hooks/types";
13+
14+
export type SampleParams = {
15+
/** some comments */
16+
someValue: number;
17+
};
18+
19+
export type SampleObject = {
20+
scene: THREE.Scene;
21+
material: THREE.Material;
22+
camera: THREE.Camera;
23+
renderTarget: THREE.WebGLRenderTarget;
24+
};
25+
26+
export const useSample = ({
27+
size,
28+
dpr,
29+
}: {
30+
size: Size;
31+
dpr: number;
32+
}): HooksReturn<SampleParams, SampleObject> => {
33+
const scene = useMemo(() => new THREE.Scene(), []);
34+
const material = useMesh(scene);
35+
const camera = useCamera(size);
36+
const updatePointer = usePointer();
37+
const [renderTarget, updateRenderTarget] = useSingleFBO({
38+
scene,
39+
camera,
40+
size,
41+
dpr,
42+
});
43+
44+
const [params, setParams] = useParams<SampleParams>({
45+
someValue: 0.0,
46+
});
47+
48+
const updateFx = useCallback(
49+
(props: RootState, updateParams: SampleParams) => {
50+
const { gl, clock, pointer } = props;
51+
52+
// ここでparamsを更新
53+
setParams(updateParams);
54+
setUniform(material, "uSomeValue", params.someValue!);
55+
56+
setUniform(material, "uTime", clock.getElapsedTime());
57+
58+
// usePointerは{currentPointer,prevPointer,diffPointer,velocity,isVelocityUpdate}を返します
59+
const { velocity } = updatePointer(pointer);
60+
setUniform(
61+
material,
62+
"uVelocity",
63+
Math.min(1.0, velocity.length() * 500)
64+
);
65+
66+
// FBOに焼き付けて、textureをreturnします
67+
const outPutTexture = updateRenderTarget(gl);
68+
return outPutTexture;
69+
},
70+
[updateRenderTarget, material, setParams, params, updatePointer]
71+
);
72+
73+
return [
74+
updateFx,
75+
setParams,
76+
{
77+
scene: scene,
78+
material: material,
79+
camera: camera,
80+
renderTarget: renderTarget,
81+
},
82+
];
83+
};

CreateKit/useSample/shader/main.frag

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
precision mediump float;
2+
3+
varying vec2 vUv;
4+
5+
uniform float uTime;
6+
uniform float uVelocity;
7+
uniform float uSomeValue;
8+
9+
void main() {
10+
vec2 uv = vUv;
11+
gl_FragColor = vec4(sin(uTime),uVelocity,uSomeValue,1.0);
12+
}

CreateKit/useSample/shader/main.vert

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
varying vec2 vUv;
2+
3+
void main() {
4+
vUv = uv;
5+
gl_Position = vec4(position, 1.0);
6+
}

CreateKit/useSample/useMesh.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { useMemo } from "react";
2+
import * as THREE from "three";
3+
import vertexShader from "./shader/main.vert";
4+
import fragmentShader from "./shader/main.frag";
5+
import { useAddMesh } from "@/packages/use-shader-fx/src";
6+
7+
type TUniforms = {
8+
uTime: { value: number };
9+
uVelocity: { value: number };
10+
uSomeValue: { value: number };
11+
};
12+
13+
export class SampleMaterial extends THREE.ShaderMaterial {
14+
uniforms!: TUniforms;
15+
}
16+
17+
export const useMesh = (scene: THREE.Scene) => {
18+
const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);
19+
const material = useMemo(
20+
() =>
21+
new THREE.ShaderMaterial({
22+
uniforms: {
23+
uTime: { value: 0.0 },
24+
uVelocity: { value: 0.0 },
25+
uSomeValue: { value: 0.0 },
26+
},
27+
vertexShader: vertexShader,
28+
fragmentShader: fragmentShader,
29+
}),
30+
[]
31+
);
32+
useAddMesh(scene, geometry, material);
33+
return material as SampleMaterial;
34+
};

app/fx/config.ts renamed to Demo/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import gsap from "gsap";
33

44
export const CONFIG = {
55
/*===============================================
6-
post fx
6+
post fx : textureを受け取り、そのテクスチャーにfxをかけて、テクスチャーを返します
77
===============================================*/
88
transitionBg: {
99
noiseStrength: 0.0,
@@ -44,7 +44,7 @@ export const CONFIG = {
4444
active: false,
4545
},
4646
/*===============================================
47-
fx
47+
fx : 流体やrippleなど、単体で動作するfxです
4848
===============================================*/
4949
ripple: {
5050
frequency: 0.01,

app/fx/ShaderMaterial.tsx renamed to Demo/fxMaterial.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ import { shaderMaterial } from "@react-three/drei";
66
declare global {
77
namespace JSX {
88
interface IntrinsicElements {
9-
mainShaderMaterial: any;
9+
fxMaterial: any;
1010
}
1111
}
1212
}
1313

14-
export type TMainShaderUniforms = {
14+
export type TFxMaterial = {
1515
u_fx: THREE.Texture | null;
1616
u_postFx: THREE.Texture;
1717
isBgActive: boolean;
1818
};
1919

20-
export const MainShaderMaterial = shaderMaterial(
20+
export const FxMaterial = shaderMaterial(
2121
{
2222
u_fx: null,
2323
u_postFx: null,

0 commit comments

Comments
 (0)