【发布时间】:2022-01-25 10:26:25
【问题描述】:
作为 Matrix 粉丝和 three.js/r3f/react/shader 的新手,我决定尝试使用类似矩阵的着色器。
我浏览了文档并找到了一些示例代码并设法将它们组合在一起,这就是我所拥有的:https://codesandbox.io/s/react-fox-matrix-shader-test-g3i4n?file=/src/App.js
import React, { Suspense, useRef } from "react";
import { Canvas, useLoader, useFrame, useThree } from "@react-three/fiber";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import fragmentShader from "./fragment.js";
import vertexShader from "./vertex.js";
import * as THREE from "three";
import { OrbitControls } from "@react-three/drei";
const clock = new THREE.Clock();
const uniforms = {
u_resolution: { value: { x: window.innerWidth, y: window.innerHeight } },
u_time: { value: 0.0 }
};
const matrixMaterial = new THREE.ShaderMaterial({
vertexShader: vertexShader,
fragmentShader: fragmentShader,
uniforms
});
const Model = () => {
const group = useRef();
const gltf = useLoader(GLTFLoader, "models/scene.gltf"); //Modify to arwing.glb and shader is not working
const model = gltf.scene;
model.traverse((m) => {
if (m instanceof THREE.Mesh) {
m.material = matrixMaterial;
m.material.side = THREE.DoubleSide;
}
});
useFrame(() => {
matrixMaterial.uniforms.u_time.value = clock.getElapsedTime();
group.current.rotation.y += 0.004;
});
return <primitive ref={group} object={model} />;
};
export default function App() {
const canvasRef = useRef();
return (
<>
<Canvas
ref={canvasRef}
style={{ background: "white" }}
onCreated={({ camera }) => {
camera.position.set(0, 20, 30);
}}
>
<directionalLight />
<Suspense fallback={null}>
<Model />
</Suspense>
<OrbitControls />
</Canvas>
</>
);
}
const vertexShader = `
varying vec2 vUv;
void main()
{
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;
export default vertexShader;
可能是什么原因?我相信我缺少一些关于图形或 gltf/glb 的背景知识
感谢任何有关如何调试此类问题的建议。
【问题讨论】:
-
@Rabbid76 感谢您的提醒!我已经在帖子中添加了代码,希望它能澄清问题。
-
有什么问题?代码框链接对我来说似乎很好用。我看到模型上的矩阵纹理。
-
@2pha 如果将 l24 上的模型源修改为“models/arwing.glb”,着色器将无法工作,只会显示黑色外观。
标签: three.js shader react-three-fiber