自定义着色器
在 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 | 当前渲染视图的索引。 |
对于其他信息,请参考编辑器附带的着色器。 有些仅在通过预处理器符号启用时可用。