SuperAPI AI 工具集

threejs-shaders

设计与创作

查看项目

更新于 10-14 17:54

技能介绍

该资料是 Three.js 自定义着色器(shaders)的使用参考,主要面向需要编写自定义视觉特效、修改顶点或编写片元着色器的场景。资料以代码示例为主,覆盖以下内容。

一、快速开始与材质选择 给出了 ShaderMaterial 的基本结构:通过 uniforms 传入 time、color 等参数,配合 vertexShader 与 fragmentShader 字符串,并在动画循环中更新 uniform 值(如 material.uniforms.time.value = clock.getElapsedTime())。资料对比了两种材质:ShaderMaterial 由 Three.js 提供内置 uniforms 与 attributes(如 modelMatrix、modelViewMatrix、projectionMatrix、viewMatrix、normalMatrix、cameraPosition,以及 position、normal、uv 等 attribute);RawShaderMaterial 则需要自行定义全部内容,包括 precision 声明、attribute 与 uniform 声明。

二、Uniforms 与 Varyings Uniform 类型覆盖数字(float、int)、向量(vec2/vec3/vec4)、颜色(Color,会转换为 vec3)、矩阵(mat3、mat4)、纹理(sampler2D、samplerCube)以及数组(floatArray、vec3Array),并给出对应的 GLSL 声明写法。更新方式包括直接赋值、对向量/颜色调用 set 或 setHSL、对矩阵调用 copy。Varyings 部分说明如何从顶点着色器向片元着色器传递插值数据,例如 vUv、vNormal、vPosition。

三、常见着色器模式 资料给出了多个可直接参考的模式:纹理采样(texture2D(map, vUv))、顶点位移(基于 sin 波的波浪位移)、Fresnel 效果(结合 cameraPosition 与法线计算边缘光)、基于噪声的效果(random 与 value noise 函数)、渐变(线性、径向、smoothstep 平滑渐变)、Rim Lighting(边缘光)以及 Dissolve 溶解效果(使用 discard 与边缘发光)。

四、扩展内置材质 介绍通过 onBeforeCompile 修改现有材质着色器的方式,包括添加自定义 uniform、保存 shader 引用以便在动画循环中更新、用 replace 注入代码,并列出常用的注入点,如顶点着色器的 #include <begin_vertex>、#include <project_vertex>、#include <beginnormal_vertex>,以及片元着色器的 #include <color_fragment>、#include <output_fragment>、#include <fog_fragment>。

五、GLSL 内置函数与材质属性 列出数学函数(abs、sign、floor、fract、mod、min、max、clamp、mix、step、smoothstep、三角函数、指数函数等)、向量函数(length、distance、dot、cross、normalize、reflect、refract 及分量比较函数)、纹理函数(GLSL 1.0 的 texture2D/textureCube;GLSL 3.0 下改用 texture() 并使用 out vec4 fragColor 替代 gl_FragColor,同时提及 textureSize)。材质属性部分涵盖 transparent、opacity、side、depthTest、depthWrite、blending、wireframe、extensions(derivatives、fragDepth、drawBuffers、shaderTextureLOD)以及 glslVersion(如 THREE.GLSL3)。

六、Shader Includes、外部文件与实例化 说明可通过 import { ShaderChunk } from "three" 复用 Three.js 着色器代码块(如 ShaderChunk.common、ShaderChunk.packing);在 vite/webpack 环境下可从 .glsl 文件导入顶点与片元着色器;实例化着色器通过 InstancedBufferAttribute 设置实例属性(如 offset)并在顶点着色器中使用。

七、调试与性能 调试方面建议在 onBeforeCompile 中打印 shader 源码、通过输出 UV、法线、位置进行可视化调试,并开启 renderer.debug.checkShaderErrors。性能建议包括减少 uniform 数量(合并为向量)、用 mix/step 替代 if/else 条件分支、尽量在 JS 侧预计算、对复杂函数使用纹理查找表、减少透明物体以限制 overdraw,并给出了 if/else 改写为 mix 的示例。

适用场景:需要实现自定义视觉特效、顶点变形、片元着色器、溶解/边缘光/噪声等效果的 Three.js 项目。限制:资料未提供关于收费、价格、平台兼容范围或具体性能数据的说明,这些内容暂未提供。