Skip to content

语言

为 SandMod 编写 着色器(Shader)时,使用以下语言:

GLSL 编程语言。使用它可编写着色器程序本身。有关 GLSL 的基础语法,请参阅 GLSL 语法简介 章节。

SandMod 还根据游戏引擎额外定义了其他命令和参数,可以定义着色器对象,充当着色器程序的容器。

👉 支持语义(Shader Semantics),SandMod 封装且支持的语义,用于表示输入和输出变量的用途。

👉 内置全局 Uniform(Build-in Uniforms),SandMod 支持且公开的全局变量。

👉 命令(Commands),SandMod 封装的命令,让您更便捷地实现着色器部分功能。

👉 内置宏(Built-in Macros),SandMod 内置的新类型、公式、无理数近似值以及方法。

基础要求

  • 编写 着色器(Shader)的代码必须在着色器资产中编辑,关于着色器资产的定义和创建、导入方式,请参阅 着色器资产 章节。

  • 着色器(Shader)的代码中必须要定义名字,没有定义名字的着色器代码会在 SandMod 编译时编译失败。定义着色器名字的方法请参阅 name 命令章节。

  • 您可以使用 Shader::Find({$shader_full_name}) 接口获取其他 着色器(Shader)的代码。

  • SandMod 不支持您使用 Uniform 或 UBO(Uniform Buffer Object)定义、读取全局着色器变量, 请通过使用 property 命令定义材质参数和使用 using 命令使用全局着色器变量 Uniform 替代。

  • 当前版本不支持在 入参 / 出参 结构体(Struct)中使用宏定义。

关于调试

您可以在 项目窗口(Project)的文件夹层级列表中找到根级文件夹 Assets 文件夹,鼠标指向该文件夹后点击右键,并在右键上下文菜单中点击 在资源管理器中显示(Show In Explorer) 的选项打开游戏项目文件夹。

【Shader_Editing001.png】

在游戏项目文件夹下,通过路径 Error\Shader 查看着色器代码的报错。

【Shader_Editing002.png】

Unity 移植问题

SandMod 的 着色器(Shader)编辑和 Unity 相似,但是由于使用的语言不同,在编辑过程中需要注意以下问题:

  • SandMod 会在代码中给变量赋值时,依靠字面量来区分类型,因此书写需要更为规范。
float a = 1;
float b = 0;

都可以通过编译。
float a = 1.0;
int b = 0;

才可以通过编译,直接编辑 float a = 1; 会导致编译失败。

  • SandMod 必须匹配向量的个数不能使用隐式转换。
float3 a = float2(1, 0);
float b;
float3 c = a * b;

可以通过编译。
vec3 a = vec3(1.0, 0.0 , 1.0);
float b;
float3 c = a * vec3(b, b, b);

才能通过编译。
  • 无法完全支持 HLSL 的所有变量类型,仅能部分支持,具体您可以参阅 内置宏 章节进行了解。

  • HLSL 函数库比 GLSL 丰富,为解决这一问题,目前 SandMod 已经通过内置宏支持了部分函数或者编辑方法,但是不能保证都支持,具体支持的内容请参阅 内置宏 章节。

  • 暂时 SandMod 无法支持部分 HLSL 才具有的特性,如 HLSL 需要 sampler 和 texture 分开,且可以在 着色器(Shader)声明采样模式,具体可以在实践中尝试。