SuperAPI AI 工具集

threejs-syntax-shaders

前端与建站

查看项目

更新于 10-15 12:03

技能介绍

用途

threejs-syntax-shaders 是一个面向 Three.js 自定义着色器编写的语法参考技能,用于在编写 GLSL 着色器、创建 ShaderMaterial 或 RawShaderMaterial、定义 uniform,或通过 onBeforeCompile 修补内置材质时提供准确的语法与用法指引。

主要能力

ShaderMaterial 与 RawShaderMaterial 对比

技能以表格形式对比两者的关键差异:ShaderMaterial 会自动注入内置 uniform 与 attribute,支持 #include <chunk>,自动声明精度,适合扩展 Three.js 渲染;RawShaderMaterial 不注入任何内容,必须自行声明全部 uniform、attribute 与精度,适合完全控制着色器源码或移植外部着色器。

Uniform 类型映射

提供 GLSL 类型到 JavaScript 值的映射表,例如 float 对应 { value: 1.0 },vec3 对应 { value: new THREE.Vector3() } 或 { value: new THREE.Color() },sampler2D 对应 { value: texture },数组类型对应 { value: [1.0, 2.0, 3.0] } 等。

关键警告

技能列出多条必须遵守的规则:uniform 必须用 { value: ... } 包裹,直接写裸值会静默失败;ShaderMaterial 中不得声明内置 uniform 或 attribute,否则导致 GLSL 编译错误;RawShaderMaterial 必须声明全部 uniform、attribute 与精度;glslVersion 为 THREE.GLSL3 时不得使用 gl_FragColor 或 texture2D(),应改用声明的 out vec4 变量与 texture();修改 defines 后必须设置 material.needsUpdate = true 以触发重新编译。

ShaderMaterial 用法

给出构造函数示例,包含 uniforms、vertexShader、fragmentShader 等参数,并列出 uniforms、uniformsGroups、vertexShader、fragmentShader、defines、extensions、wireframe、lights、fog、clipping、glslVersion、defaultAttributeValues 等属性及其类型、默认值与说明。同时列出 ShaderMaterial 自动注入的内置 uniform(如 modelMatrix、modelViewMatrix、projectionMatrix、viewMatrix、normalMatrix、cameraPosition 等)与内置 attribute(如 position、normal、uv、uv2、tangent、color)。

RawShaderMaterial 用法

给出完整示例,强调必须在两个着色器顶部添加 precision highp float;(或 mediump),否则在移动端及部分桌面驱动上会导致 GLSL 编译错误。

ShaderChunk 代码复用

说明 THREE.ShaderChunk 包含 Three.js 内部着色器片段,可在 ShaderMaterial(非 RawShaderMaterial)中使用 #include <chunk_name> 引入。列出常用 chunk,如 <common>、<fog_pars_vertex>、<fog_vertex>、<shadowmap_pars_vertex>、<shadowmap_vertex>、<lights_pars_begin>、<begin_vertex>、<project_vertex>、<normal_fragment_begin>、<color_pars_vertex>、<color_vertex> 等,并说明可通过 THREE.ShaderChunk.common 等方式以编程方式读取片段源码。

onBeforeCompile 材质补丁

说明如何在编译时修改现有材质的着色器,以保留 PBR 光照、阴影等内置特性。示例展示替换 #include <begin_vertex> 注入自定义顶点位移,并强调必须重写 customProgramCacheKey(),否则 Three.js 可能复用未修补的缓存着色器程序,导致修改静默失效;同时提醒在访问 uniform 前检查 material.userData.shader 是否存在,因为该对象在首次渲染时惰性创建,并可能在 needsUpdate 时重建。

Defines 预处理指令

展示如何通过 defines 对象定义 #define 指令,包括空值、数值与字符串值,并说明运行时修改 defines 后必须设置 needsUpdate = true。

GLSL3 模式

展示 glslVersion: THREE.GLSL3 下的写法,包括 attribute 变为 in、varying 变为 out/in、gl_FragColor 替换为声明的 out vec4、texture2D() 与 textureCube() 替换为 texture()。并提供 GLSL1 与 GLSL3 的语法对照表。

Uniform 更新模式

展示在动画循环中直接修改 material.uniforms.uTime.value 等属性,并强调不得替换 uniform 对象本身,否则会破坏内部引用。

使用方式

该技能以速查表与代码示例形式组织,可直接查阅对应章节获取语法与注意事项。技能还提供参考链接:references/methods.md(完整 API 签名)、references/examples.md(可运行代码示例)、references/anti-patterns.md(应避免的做法),以及 Three.js 官方文档中 ShaderMaterial、RawShaderMaterial、ShaderChunk、UniformsLib 的链接。

适用场景

适用于需要编写或调试 Three.js 自定义 GLSL 着色器的开发者,包括创建自定义材质、移植外部着色器、修补内置材质以添加自定义效果、在 GLSL1 与 GLSL3 之间切换等场景。

限制

该技能为语法参考,不涉及具体渲染效果的实现细节;资料中未提供收费、价格、平台支持范围等信息。