Skip to content

Custom Shader Material

自 2.0.0
Photon Custom Shader Material Inspector
Custom Shader Material 的 Shader 选择、重载按钮,以及从 Shader JSON 自动生成的参数。

Custom Shader Material 直接加载 Minecraft Core Shader 的 JSON、VSH 和 FSH。它不是已经被 Shader Graph 取代的旧功能:需要移植 GLSL、使用几何着色器或编写 Graph 尚未覆盖的算法时,应使用它。

本主题分为三页:

顶点布局与粒子数据另见 Vertex Format 与 GPU InstancingAdditional GPU Data

文件放在哪里

text
assets/<namespace>/shaders/core/<name>.json
assets/<namespace>/shaders/core/<vertex>.vsh
assets/<namespace>/shaders/core/<fragment>.fsh
assets/<namespace>/shaders/include/<library>.glsl   # 可选

材质中的 Shader ID 是 <namespace>:<name>,不含 assets/shaders/core/.json。例如:

text
assets/wiki/shaders/core/dissolve_particle.json

wiki:dissolve_particle

开发中的资源可以放进已启用 Resource Pack 或 Mod Jar。使用编辑器的文件选择器时,文件仍必须位于某个 assets/<namespace>/shaders/core/ 下,Photon 才能推导出 Shader ID。

在编辑器中使用

  1. 在 Emitter 的 Renderer > Materials 中添加 Custom Shader Material
  2. 点击 Select Shader 选择 Core Shader JSON,或直接填写 Shader ID。
  3. 编译成功后,展开 Shader Settings
  4. 为自定义 Texture、数字、向量或颜色参数填写值。
  5. 修改 JSON/VSH/FSH 后点击 Reload Shader

预览变成红色错误文字时,先修复编译错误再重载。Photon 会缓存失败状态,避免每一帧重新创建失败的 GL Program。

Inspector 如何识别参数

LDShaderHolder 读取 JSON 声明并自动为“非内置”项创建控件。

JSON 声明Inspector 控件
自定义 sampler,例如 TextureNoiseTexture纹理选择与预览
int,count 1–4整数或整数向量
float,count 1–4浮点数或浮点向量
vec3 名称含 colorrgbRGB 颜色
vec4 名称含 colorrgbaRGBA 颜色
vec4 名称含 hdremissionHDR 颜色与强度

命名会影响控件类型。TintColor 会显示颜色控件,Direction 会显示向量控件。

保留名称

所有以 Sampler 开头的 sampler 和所有以 U_ 开头的 uniform 都被视为内置项,不会出现在 Shader Settings 中。只使用参考页列出的名称;自定义参数不要使用这两个前缀。

参数值随材质保存。重载 Shader 时,只要名称和类型仍匹配,Photon 会尽量保留已有值;删除或改名的参数需要重新配置。

选择 Shader Graph 还是手写 Shader

需求选择
常规材质逻辑、跨 Renderer 复用Shader Graph
已有 GLSL/Core ShaderCustom Shader Material
几何着色器Custom Shader Material
自动声明 GPU ChannelShader Graph
手动控制 Attribute、Varying 和 GLSL IncludeCustom Shader Material

手写 Shader 不会自动推断所需的 Additional GPU Data。读取相关通道时,必须在 Emitter 中手动启用,并核对对应渲染路径是否支持。

下一步

继续完成一个可运行的三文件 Shader:手写 Core Shader 与 ExtendedShader。写 Shader 时需要查名字,则直接打开内置 Uniform 与 Sampler 参考

Released under the MIT License.