@vvfx/shader2ge 0.0.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +309 -0
- package/dist/convert.d.ts +52 -0
- package/dist/generate-scene.d.ts +10 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +1915 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1883 -0
- package/dist/index.mjs.map +1 -0
- package/dist/material-uniforms.d.ts +15 -0
- package/dist/parse-shader.d.ts +28 -0
- package/dist/parse-uniforms.d.ts +8 -0
- package/dist/scene-builders.d.ts +18 -0
- package/dist/templates.d.ts +77 -0
- package/dist/types.d.ts +84 -0
- package/dist/uniform-utils.d.ts +34 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019-present Ant Group Co., Ltd. https://www.antgroup.com/
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
## @vvfx/shader2ge
|
|
2
|
+
|
|
3
|
+
将 GLSL Fragment Shader 转换为 [Galacean Effects](https://galacean.antgroup.com/effects/) (GE) 格式的转换引擎。支持原生 GE 格式与 [Shadertoy](https://www.shadertoy.com/) 格式(自动桥接 `mainImage` / `iTime` / `iResolution` / `iChannel0~3`)。
|
|
4
|
+
|
|
5
|
+
## 支持矩阵
|
|
6
|
+
|
|
7
|
+
### 输入与运行环境
|
|
8
|
+
|
|
9
|
+
| 输入类型 | API 调用 | 运行环境 | 说明 |
|
|
10
|
+
| --- | --- | --- | --- |
|
|
11
|
+
| GE 原生 fragment shader | `convert(source)` | 浏览器 / Node.js | `void main()` + `varying vec2 vUV` + `varying float vTime` |
|
|
12
|
+
| Shadertoy fragment shader | `convert(source)` | 浏览器 / Node.js | 检测到 `mainImage` 自动桥接,无需改写源码 |
|
|
13
|
+
| 带纹理输入 | `convert(source, { uniformOverrides })` | 浏览器 / Node.js | 通过 `TextureInput` 为 `sampler2D` 赋图 URL |
|
|
14
|
+
| Shadertoy 通道纹理 | `convert(source, { shadertoyChannels })` | 浏览器 / Node.js | 映射 `iChannel0~3` 到纹理 URL |
|
|
15
|
+
| 仅解析不生成 | `parseShader(source)` | 浏览器 / Node.js | 返回桥接后的源码、uniform 列表、Shadertoy 标志、结构警告 |
|
|
16
|
+
|
|
17
|
+
### Uniform 类型覆盖
|
|
18
|
+
|
|
19
|
+
| GLSL 类型 | 状态 | 说明 |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| `float` / `int` | ✅ 已支持 | 通过 `materials.floats` / `materials.ints` |
|
|
22
|
+
| `vec2` / `vec3` / `vec4` | ✅ 已支持 | 一律写入 `materials.vector4s`(vec2/vec3 自动 padding) |
|
|
23
|
+
| `sampler2D` | ✅ 已支持 | 通过 `TextureInput` 提供 URL,未提供时使用 1×1 白纹理 |
|
|
24
|
+
| `mat4` 等矩阵类型 | ❌ 不支持 | 与 GE Material 字段约定不兼容 |
|
|
25
|
+
|
|
26
|
+
### Shadertoy 自动桥接内容
|
|
27
|
+
|
|
28
|
+
| Shadertoy 变量/函数 | 桥接处理 |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| `void mainImage(out vec4 fragColor, in vec2 fragCoord)` | 包装为 `void main()` + 写入 `gl_FragColor` |
|
|
31
|
+
| `iTime` | `#define iTime vTime`(GE 的 `_Time.y`) |
|
|
32
|
+
| `iResolution` | `uniform vec4 iResolution`(由 `previewSize` 填充) |
|
|
33
|
+
| `fragCoord` | `vUV * iResolution.xy` |
|
|
34
|
+
| `iChannel0~3` | 自动注入 `uniform sampler2D iChannelN;`,通过 `shadertoyChannels` 提供纹理 |
|
|
35
|
+
|
|
36
|
+
## 已知限制
|
|
37
|
+
|
|
38
|
+
1. **基于 WebGL 1.0**:vertex shader 是固定模板(全屏 Quad),fragment shader 必须遵守 GLSL ES 1.0 语法(不能用 `#version 300 es` / `in/out` 修饰符 / `texture()` / 整数 `mod()` 等)。
|
|
39
|
+
2. **向量 uniform 必须声明为 `vec4`**:因为 GE Material 的向量字段统一用 `glUniform4f` 设值,`uniform vec2/vec3` 会触发运行时报错 `Uniform size does not match`。需要 vec2/vec3 时声明为 `vec4` 后通过 swizzle 取用。
|
|
40
|
+
3. **Shadertoy 多 Pass 不支持**:仅支持单 Image pass。Buffer A/B/C/D、`iMouse`、`iFrame`、`iDate`、`iChannelResolution` 暂未实现。
|
|
41
|
+
4. **`uTime` 自动桥接**:源码中的 `uniform float uTime;` 会被替换为 `varying float vTime;` + `#define uTime vTime`。建议直接使用 `vTime`。
|
|
42
|
+
5. **构造函数参数限制**:WebGL 1.0 下 `vec2()` / `vec3()` / `vec4()` 的参数必须是简单变量或常量,不能含算术运算。搬运 Shadertoy 时如遇 `'constructor' : too many arguments`,需要将复杂表达式拆为临时变量。
|
|
43
|
+
|
|
44
|
+
## 安装
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm install @vvfx/shader2ge
|
|
48
|
+
# 或
|
|
49
|
+
pnpm add @vvfx/shader2ge
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 快速开始
|
|
53
|
+
|
|
54
|
+
### 转换 GE 原生 shader
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { convert } from '@vvfx/shader2ge';
|
|
58
|
+
|
|
59
|
+
const result = convert(`
|
|
60
|
+
precision highp float;
|
|
61
|
+
varying vec2 vUV;
|
|
62
|
+
varying float vTime;
|
|
63
|
+
void main() {
|
|
64
|
+
vec3 col = 0.5 + 0.5 * cos(vTime + vUV.xyx + vec3(0, 2, 4));
|
|
65
|
+
gl_FragColor = vec4(col, 1.0);
|
|
66
|
+
}
|
|
67
|
+
`, {
|
|
68
|
+
sceneName: 'CosineGradient',
|
|
69
|
+
duration: 5,
|
|
70
|
+
previewSize: [1280, 720],
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
console.log(result.scene); // GE JSONScene,可直接交给 @galacean/effects 播放
|
|
74
|
+
console.log(result.uniforms); // 解析出的 uniform 列表
|
|
75
|
+
console.log(result.warnings); // 转换警告(如缺 main()、未写 gl_FragColor 等)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 搬运 Shadertoy
|
|
79
|
+
|
|
80
|
+
无需改写源码——检测到 `mainImage` 后自动桥接:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
const result = convert(`
|
|
84
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
85
|
+
vec2 uv = fragCoord / iResolution.xy;
|
|
86
|
+
vec3 col = 0.5 + 0.5 * cos(iTime + uv.xyx + vec3(0, 2, 4));
|
|
87
|
+
fragColor = vec4(col, 1.0);
|
|
88
|
+
}
|
|
89
|
+
`);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 带纹理输入
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
const result = convert(`
|
|
96
|
+
precision highp float;
|
|
97
|
+
varying vec2 vUV;
|
|
98
|
+
uniform sampler2D uMainTex;
|
|
99
|
+
void main() {
|
|
100
|
+
gl_FragColor = texture2D(uMainTex, vUV);
|
|
101
|
+
}
|
|
102
|
+
`, {
|
|
103
|
+
uniformOverrides: {
|
|
104
|
+
uMainTex: { url: 'https://example.com/image.png' },
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Shadertoy 带纹理通道
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
const result = convert(shadertoyCode, {
|
|
113
|
+
shadertoyChannels: {
|
|
114
|
+
iChannel0: { url: 'https://example.com/noise.png', wrapS: 10497, wrapT: 10497 },
|
|
115
|
+
iChannel1: { url: 'https://example.com/gradient.png' },
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
未提供的通道使用内置 1×1 白纹理(`DEFAULT_WHITE_TEXTURE_URL`)。
|
|
121
|
+
|
|
122
|
+
### 仅解析不生成(轻量预检)
|
|
123
|
+
|
|
124
|
+
某些场景下你只想了解 shader 结构(uniform 列表、是否 Shadertoy、有没有结构错误),并不需要完整生成 JSONScene。例如 AI 流水线中先 parse 检视 warnings 决定是否重试,节省一次完整转换的开销:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import { parseShader } from '@vvfx/shader2ge';
|
|
128
|
+
|
|
129
|
+
const parsed = parseShader(source);
|
|
130
|
+
|
|
131
|
+
console.log(parsed.fragment); // 桥接 / 兜底处理后的最终 GLSL 源码(GE-ready)
|
|
132
|
+
console.log(parsed.uniforms); // [{ name: 'uColor', type: 'vec4' }, ...]
|
|
133
|
+
console.log(parsed.isShadertoy); // 是否为 Shadertoy 格式
|
|
134
|
+
console.log(parsed.warnings); // ['Fragment shader does not contain a main() function...']
|
|
135
|
+
|
|
136
|
+
if (parsed.warnings.length === 0) {
|
|
137
|
+
// 结构 OK,可以走完整 convert
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`parseShader` 与 `ConvertOptions` 完全无关——`convert` 内部就是先调它再做选项应用与 scene 生成。
|
|
142
|
+
|
|
143
|
+
### 配合 GE Player 播放
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { Player } from '@galacean/effects';
|
|
147
|
+
import { convert } from '@vvfx/shader2ge';
|
|
148
|
+
|
|
149
|
+
const { scene } = convert(fragmentShader, { previewSize: [1280, 720] });
|
|
150
|
+
const player = new Player({ container: document.getElementById('canvas')! });
|
|
151
|
+
await player.loadScene(scene);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## API 参考
|
|
155
|
+
|
|
156
|
+
### `convert(fragmentShader, options?)`
|
|
157
|
+
|
|
158
|
+
主入口。将 GLSL fragment shader 源码转换为可播放的 GE JSONScene。
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
function convert(
|
|
162
|
+
fragmentShader: string,
|
|
163
|
+
options?: ConvertOptions,
|
|
164
|
+
): ConvertResult;
|
|
165
|
+
|
|
166
|
+
interface ConvertOptions {
|
|
167
|
+
/** 场景名称,默认 "ShaderScene" */
|
|
168
|
+
sceneName?: string;
|
|
169
|
+
/** 合成时长(秒),默认 5 */
|
|
170
|
+
duration?: number;
|
|
171
|
+
/** 合成结束行为,默认 EndBehavior.Restart(循环) */
|
|
172
|
+
endBehavior?: EndBehavior;
|
|
173
|
+
/** 预览尺寸 [width, height],默认 [512, 512];自动注入到 uResolution */
|
|
174
|
+
previewSize?: [number, number];
|
|
175
|
+
/** uniform 默认值覆盖(float / vec / color / TextureInput) */
|
|
176
|
+
uniformOverrides?: Record<string, UniformValue>;
|
|
177
|
+
/** Shadertoy 纹理通道映射,key 为 iChannel0~3 */
|
|
178
|
+
shadertoyChannels?: Record<string, TextureInput>;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
interface ConvertResult {
|
|
182
|
+
/** 生成的可播放 GE JSONScene */
|
|
183
|
+
scene: JSONScene;
|
|
184
|
+
/** 解析出的 uniform 列表 */
|
|
185
|
+
uniforms: ParsedUniform[];
|
|
186
|
+
/** 转换过程中的警告(结构问题 + 纹理缺省提示等) */
|
|
187
|
+
warnings: string[];
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### `parseShader(source)`
|
|
192
|
+
|
|
193
|
+
输入解析阶段。返回 shader 的中间表示(IR),不依赖任何 ConvertOptions。
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
function parseShader(source: string): ParsedShader;
|
|
197
|
+
|
|
198
|
+
interface ParsedShader {
|
|
199
|
+
/** 桥接 / 兜底处理后的最终 GLSL fragment shader 源码 */
|
|
200
|
+
fragment: string;
|
|
201
|
+
/** 解析出的 uniform 列表(uTime 桥接后已从中移除) */
|
|
202
|
+
uniforms: ParsedUniform[];
|
|
203
|
+
/** 输入是否为 Shadertoy 格式(含 mainImage 函数) */
|
|
204
|
+
isShadertoy: boolean;
|
|
205
|
+
/** 解析阶段产生的警告 */
|
|
206
|
+
warnings: string[];
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### `parseUniforms(source)`
|
|
211
|
+
|
|
212
|
+
更底层的工具函数,仅做 uniform 声明的正则提取,不做 Shadertoy 桥接、不做结构校验。需要细粒度控制时使用,否则推荐用 `parseShader`。
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
function parseUniforms(source: string): ParsedUniform[];
|
|
216
|
+
|
|
217
|
+
interface ParsedUniform {
|
|
218
|
+
name: string;
|
|
219
|
+
type: 'float' | 'vec2' | 'vec3' | 'vec4' | 'int' | 'sampler2D';
|
|
220
|
+
comment?: string;
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### `generateScene(fragment, uniforms, options, isShadertoy)`
|
|
225
|
+
|
|
226
|
+
低阶 API,`convert` 内部使用。一般业务不需要直接调;适合已经在外面做完所有 parse 工作、只想拼装 JSONScene 的场景。
|
|
227
|
+
|
|
228
|
+
### 类型定义
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
type UniformValue =
|
|
232
|
+
| number
|
|
233
|
+
| { x: number; y: number } // vec2
|
|
234
|
+
| { x: number; y: number; z: number } // vec3
|
|
235
|
+
| { x: number; y: number; z: number; w: number } // vec4
|
|
236
|
+
| { r: number; g: number; b: number; a: number } // color
|
|
237
|
+
| TextureInput; // sampler2D
|
|
238
|
+
|
|
239
|
+
interface TextureInput {
|
|
240
|
+
/** 图片 URL(http / https / data URI / 相对路径) */
|
|
241
|
+
url: string;
|
|
242
|
+
/** GL 纹理环绕模式 S,默认 REPEAT (10497) */
|
|
243
|
+
wrapS?: number;
|
|
244
|
+
/** GL 纹理环绕模式 T,默认 REPEAT (10497) */
|
|
245
|
+
wrapT?: number;
|
|
246
|
+
/** GL 放大过滤,默认 LINEAR (9729) */
|
|
247
|
+
magFilter?: number;
|
|
248
|
+
/** GL 缩小过滤,默认 LINEAR (9729) */
|
|
249
|
+
minFilter?: number;
|
|
250
|
+
/** 是否翻转 Y 轴,默认 true */
|
|
251
|
+
flipY?: boolean;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
enum EndBehavior {
|
|
255
|
+
Destroy = 0,
|
|
256
|
+
Forward = 2,
|
|
257
|
+
Freeze = 4,
|
|
258
|
+
Restart = 5,
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 模板常量
|
|
263
|
+
|
|
264
|
+
也作为 named export 暴露,便于业务侧自行拼装场景或对齐默认值:
|
|
265
|
+
|
|
266
|
+
```ts
|
|
267
|
+
import {
|
|
268
|
+
DEFAULT_VERTEX_SHADER, // 全屏 Quad vertex shader(固定模板)
|
|
269
|
+
FALLBACK_FRAGMENT_SHADER, // 兜底 fragment shader(输入为空时使用)
|
|
270
|
+
DEFAULT_WHITE_TEXTURE_URL, // 1×1 白纹理 base64 data URI
|
|
271
|
+
GL_TEXTURE_WRAP_REPEAT, // 10497
|
|
272
|
+
GL_TEXTURE_WRAP_CLAMP_TO_EDGE,// 33071
|
|
273
|
+
GL_TEXTURE_FILTER_LINEAR, // 9729
|
|
274
|
+
GL_TEXTURE_FILTER_NEAREST, // 9728
|
|
275
|
+
GL_TEXTURE_2D, // 3553
|
|
276
|
+
} from '@vvfx/shader2ge';
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## 自动注入的内置 uniform
|
|
280
|
+
|
|
281
|
+
转换引擎会按需注入这些 uniform,即使源码里没有声明也可以使用:
|
|
282
|
+
|
|
283
|
+
| Uniform | 类型 | 来源 |
|
|
284
|
+
| --- | --- | --- |
|
|
285
|
+
| `vTime` | `varying float` | GE `_Time.y`(vertex shader 桥接) |
|
|
286
|
+
| `vUV` | `varying vec2` | 全屏 Quad 顶点 UV |
|
|
287
|
+
| `uResolution` | `vec4` | shader 声明了 `uniform vec4 uResolution` 时,由 `options.previewSize` 自动填充为 `(width, height, 1, 0)`,避免预览尺寸变化后宽高比矫正错位 |
|
|
288
|
+
| `iTime` | `#define iTime vTime` | Shadertoy 模式 |
|
|
289
|
+
| `iResolution` | `uniform vec4` | Shadertoy 模式,由 `previewSize` 填充 |
|
|
290
|
+
| `iChannel0~3` | `uniform sampler2D` | Shadertoy 模式 + 引用了对应通道时自动注入 |
|
|
291
|
+
|
|
292
|
+
## 架构
|
|
293
|
+
|
|
294
|
+
shader2ge 内部分两阶段:
|
|
295
|
+
|
|
296
|
+
```
|
|
297
|
+
源码 ──parseShader──▶ ParsedShader IR ──convert──▶ ConvertResult
|
|
298
|
+
(fragment, uniforms, (scene, uniforms,
|
|
299
|
+
isShadertoy, warnings) warnings)
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
- `parseShader`:纯输入理解,与 options 无关
|
|
303
|
+
- `convert`:应用 ConvertOptions(uniformOverrides / shadertoyChannels / previewSize / sceneName / duration),生成 JSONScene
|
|
304
|
+
|
|
305
|
+
如果你只关心 shader 元信息或想在转换前预检,调 `parseShader` 即可,避免支付 scene 生成的开销。
|
|
306
|
+
|
|
307
|
+
## License
|
|
308
|
+
|
|
309
|
+
MIT
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* shader2ge 主入口 API
|
|
3
|
+
* 输入 fragment shader 源码 → 输出可播放的 GE JSONScene
|
|
4
|
+
* 支持原生 GE 格式和 Shadertoy 格式的 fragment shader
|
|
5
|
+
*/
|
|
6
|
+
import type { ConvertOptions, ConvertResult } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* 将 fragment shader 源码转换为可在 GE Runtime 播放的 JSONScene。
|
|
9
|
+
*
|
|
10
|
+
* 内部委托 {@link parseShader} 完成输入理解(Shadertoy 桥接、uniform 提取、uTime 桥接、
|
|
11
|
+
* 基础校验),自身只负责应用 ConvertOptions 与生成 JSONScene。
|
|
12
|
+
*
|
|
13
|
+
* @param fragmentShader - GLSL fragment shader 源码
|
|
14
|
+
* @param options - 转换选项(场景名称、时长、uniform 覆盖、Shadertoy 通道映射等)
|
|
15
|
+
* @returns 转换结果,包含 scene、warnings 和解析出的 uniforms
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // 纯数学生成效果
|
|
20
|
+
* const result = convert(`
|
|
21
|
+
* precision highp float;
|
|
22
|
+
* varying vec2 vUV;
|
|
23
|
+
* varying float vTime;
|
|
24
|
+
* void main() {
|
|
25
|
+
* vec3 col = 0.5 + 0.5 * cos(vTime + vUV.xyx + vec3(0,2,4));
|
|
26
|
+
* gl_FragColor = vec4(col, 1.0);
|
|
27
|
+
* }
|
|
28
|
+
* `);
|
|
29
|
+
*
|
|
30
|
+
* // 带纹理输入的效果
|
|
31
|
+
* const result = convert(`
|
|
32
|
+
* precision highp float;
|
|
33
|
+
* varying vec2 vUV;
|
|
34
|
+
* uniform sampler2D uMainTex;
|
|
35
|
+
* void main() {
|
|
36
|
+
* gl_FragColor = texture2D(uMainTex, vUV);
|
|
37
|
+
* }
|
|
38
|
+
* `, {
|
|
39
|
+
* uniformOverrides: {
|
|
40
|
+
* uMainTex: { url: 'https://example.com/image.png' },
|
|
41
|
+
* },
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // Shadertoy 带纹理通道
|
|
45
|
+
* const result = convert(shadertoyCode, {
|
|
46
|
+
* shadertoyChannels: {
|
|
47
|
+
* iChannel0: { url: 'https://example.com/noise.png' },
|
|
48
|
+
* },
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function convert(fragmentShader: string, options?: ConvertOptions): ConvertResult;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GE JSONScene 生成器
|
|
3
|
+
* 将 shader 源码 + 解析出的 uniform 组装成可播放的 GE JSONScene
|
|
4
|
+
*/
|
|
5
|
+
import * as spec from '@galacean/effects-specification';
|
|
6
|
+
import type { ConvertOptions, ParsedUniform } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* 核心:生成完整的可播放 GE JSONScene
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateScene(fragmentShader: string, uniforms: ParsedUniform[], options?: ConvertOptions, isShadertoy?: boolean): spec.JSONScene;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vvfx/shader2ge - Shader to Galacean Effects conversion engine
|
|
3
|
+
*
|
|
4
|
+
* 将 GLSL fragment shader 转换为可在 GE Runtime 播放的 JSONScene
|
|
5
|
+
*/
|
|
6
|
+
export * as spec from '@galacean/effects-specification';
|
|
7
|
+
export * from './convert';
|
|
8
|
+
export * from './parse-shader';
|
|
9
|
+
export * from './parse-uniforms';
|
|
10
|
+
export * from './generate-scene';
|
|
11
|
+
export * from './uniform-utils';
|
|
12
|
+
export * from './material-uniforms';
|
|
13
|
+
export * from './scene-builders';
|
|
14
|
+
export * from './templates';
|
|
15
|
+
export * from './types';
|