语言
为 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 a = 1.0;才可以通过编译,直接编辑 float a = 1; 会导致编译失败。 |
- SandMod 必须匹配向量的个数不能使用隐式转换。
float3 a = float2(1, 0);可以通过编译。 | vec3 a = vec3(1.0, 0.0 , 1.0);才能通过编译。 |
