自定义着色器
在 Wonderland Engine 中编写自定义着色器的指南。
顶点 vs 片段着色器
在 Wonderland Engine 中,我们目前开放了编写自定义片段着色器的 API。
材质结构体
材质结构体定义了输入到您的着色器的材质属性,并生成 UI。
此结构体定义使我们能够高效地打包材质输入,并在着色器的 {{ decoder }} 占位符中自动生成解包代码。
一个示例材质结构体可能如下所示:
属性类型
可以与 lowp 和 mediump 精度说明符结合使用的属性类型包括:
- float,- uint,- int: 标量值
- vec2,- vec3,- vec4: 浮点向量
- ivec2,- ivec3,- ivec4: 整数向量
精度
在 Wonderland Engine 中,lowp 将始终导致 8 位每组件编码类型,mediump 为 16 位编码类型(例如半精度浮点数),而 highp(如支持)将是 32 位编码类型。
后缀
以下后缀具有特殊含义:
- *Color: 将生成颜色选择器。对 LDR 颜色使用- lowp。
- *Texture: 将生成纹理资源下拉菜单。始终使用- mediump。
内存对齐
由于 Wonderland Engine 的材质打包方式,大多数向量类型需要对齐到 32 位。 请参见精度以了解如何计算每个组件的位数。
预处理器符号
为了编译出着色器的部分内容以提高性能,我们提供了一个扩展的预处理器实现。
功能
您可以在着色器中定义“功能符号”以启用和禁用着色器的部分内容:
FEATURE_<name> 用于定义一个名为 <name> 的功能。这些功能将在“Views > Resources > Pipelines”设置的“Features”列表中显示。
如果启用了某个功能,将定义一个符号以匹配您的功能名称,例如上述示例中的 ALPHA_MASKED(而不是 FEATURE_ALPHA_MASKED)。
片段输入
以 USE_<input> 为前缀的符号用于启用着色器输入。您有以下选项:
| 符号 | 类型 | 名称 | 
|---|---|---|
| USE_POSITION_WORLD | highp vec3 | fragPositionWorld | 
| USE_POSITION_VIEW | highp vec3 | fragPositionView | 
| USE_TEXTURE_COORDS | highp vec2 | fragTextureCoords | 
| USE_TEXTURE_COORDS_1 | highp vec2 | fragTextureCoords1 | 
| USE_COLOR | mediump vec4 | fragColor | 
| USE_TANGENT | mediump vec4 | fragTangent | 
| USE_OBJECT_ID | mediump uint | fragObjectId | 
| USE_MATERIAL_ID | mediump uint | fragMaterialId | 
| USE_NORMAL | mediump vec3 | fragNormal | 
| USE_BARYCENTRIC | mediump vec3 | fragBarycentric | 
包含
Wonderland Engine 提供了一个 GLSL 着色器包含系统。请参考现有着色器以了解常需哪些包含。
Uniforms
一些始终可用的特殊 uniform:
| Uniform | 类型 | 描述 | 
|---|---|---|
| viewIndex | uint | 当前渲染视图的索引。 | 
对于其他信息,请参考编辑器附带的着色器。 有些仅在通过预处理器符号启用时可用。