自定义着色器

在 Wonderland Engine 中编写自定义着色器的指南。

顶点 vs 片段着色器 

在 Wonderland Engine 中,我们目前开放了编写自定义片段着色器的 API。

材质结构体 

材质结构体定义了输入到您的着色器的材质属性,并生成 UI。

此结构体定义使我们能够高效地打包材质输入,并在着色器的 {{ decoder }} 占位符中自动生成解包代码。

一个示例材质结构体可能如下所示:

1struct Material {
2    lowp vec4 ambientColor;
3    mediump uint diffuseTexture;
4    lowp uint shininess;
5    lowp float ambientFactor;
6    mediump float amplifier;
7};

属性类型 

可以与 lowpmediump 精度说明符结合使用的属性类型包括:

  • 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 位。 请参见精度以了解如何计算每个组件的位数。

预处理器符号 

为了编译出着色器的部分内容以提高性能,我们提供了一个扩展的预处理器实现。

功能 

您可以在着色器中定义“功能符号”以启用和禁用着色器的部分内容:

1#define FEATURE_ALPHA_MASKED
2#define FEATURE_NORMAL_MAPPING
3#define FEATURE_VERTEX_COLORS
4#define FEATURE_WITH_EMISSIVE

FEATURE_<name> 用于定义一个名为 <name> 的功能。这些功能将在“Views > Resources > Pipelines”设置的“Features”列表中显示。 如果启用了某个功能,将定义一个符号以匹配您的功能名称,例如上述示例中的 ALPHA_MASKED(而不是 FEATURE_ALPHA_MASKED)。

片段输入 

USE_<input> 为前缀的符号用于启用着色器输入。您有以下选项:

符号类型名称
USE_POSITION_WORLDhighp vec3fragPositionWorld
USE_POSITION_VIEWhighp vec3fragPositionView
USE_TEXTURE_COORDShighp vec2fragTextureCoords
USE_TEXTURE_COORDS_1highp vec2fragTextureCoords1
USE_COLORmediump vec4fragColor
USE_TANGENTmediump vec4fragTangent
USE_OBJECT_IDmediump uintfragObjectId
USE_MATERIAL_IDmediump uintfragMaterialId
USE_NORMALmediump vec3fragNormal
USE_BARYCENTRICmediump vec3fragBarycentric

包含 

Wonderland Engine 提供了一个 GLSL 着色器包含系统。请参考现有着色器以了解常需哪些包含。

Uniforms 

一些始终可用的特殊 uniform:

Uniform类型描述
viewIndexuint当前渲染视图的索引。

对于其他信息,请参考编辑器附带的着色器。 有些仅在通过预处理器符号启用时可用。