DreamShaderLang
生成与产物

NoGeneration

NoGeneration

NoGeneration

DreamShader » Generation » NoGeneration

(2.1.2 之后) 一个源,或它的某个导出,只有命名它的编译才会构建它。其他所有编译都会让其资产保持磁盘上的原样,任何使用该资产的东西也按原样使用它。

写法#pragma nogeneration(整个文件)· 在 export 上写 /// @nogeneration(该资产)· 在 1.x 块的头部写 NoGeneration = true(该块的资产)
适用于源构建的每个资产:材质、实例(.dsi)、材质函数、图层与混合、Custom Pass 管线(.dsp)
由谁构建材质内容浏览器中的编译、还原为源、创建材质的实例、针对该文件的桥接请求、compile -Source、check -Source -Shaders
不受影响编辑器启动时的扫描、保存、它所依赖的源的重新构建(一个头部、某个 .dsi 的父级、某个 .dsp 的材质)、全部重新编译、compile -All、check -All -Shaders、cook

用于重建代价高昂的资产,或由某人在编辑器中手动调整、不应在共享头部每次更改时被重建的资产。

编写它

// M_Ocean.dss -- none of its assets is rebuilt unless the file is compiled by name.
#pragma nogeneration

export void M_Ocean(inout material m) { … }
// Only MF_Heavy is left alone; MF_Light is built as usual.
/// @nogeneration
export float3 MF_Heavy(float3 p) { … }

export float3 MF_Light(float3 p) { return MF_Heavy(p) * 0.5; }
// 1.x: on any block that builds an asset -- Shader, ShaderFunction, ShaderLayer, ShaderLayerBlend.
ShaderFunction(Name = "Noise/MF_Heavy", NoGeneration = true)
{
    …
}

1.x 文件也可以在其顶层为文件的每个块写入 #pragma nogeneration。dsc migrate 会把 NoGeneration = true 写为 /// @nogeneration。

错误代码
NoGeneration = 写成了 true、false、1 或 0 之外的值DSH2260 — 该块会像 false 那样被构建
#pragma nogeneration(…)DSH3219 — 参数会被忽略,文件仍会保持标记
在头部中写 #pragma nogenerationDSH7235 — 被忽略;包含它的文件不会被标记
在辅助项、某个 @custom 函数或某个 extern 上写 /// @nogenerationDSH7224 — 它标记的是资产,而只有 export 才有资产

未命名它的编译会做什么

源仍会被读取、绑定和检查,因此保存仍会报告其错误。然后,对于每个 NoGeneration 资产:

该资产会发生什么报告为
已存在保持原样,即使源自其构建以来已经更改info DSH8277;结果行 Skipped <path> from <source>; the source marks it NoGeneration, …
从未被构建过不写入任何内容warning DSH8278;Skipped <path> from <source>; … it has never been built.

文件的其他资产会照常构建。调用同一文件的 NoGeneration 导出的资产会调用磁盘上的资产;当没有时,会以 DSH8279 失败。

使用它的东西

没有任何东西会替它先编译一个 NoGeneration 源:

引用磁盘上存在该资产时不存在时
某个 .dsi,其 Parent 由它构建该实例会基于该资产构建 — 其参数从该资产读取,而非从源读取DSH8279
某个 .dsp pass,其 Material 由它构建基于该资产进行检查DSH8279
某个 .dss,它读取由它构建的某个 .dsp 的缓冲区基于该管线进行检查DSH8279
某个 extern 函数,或某个命名该资产的 1.x MaterialFunctionCall该资产,与任何资产一样发射器的 DSH8219

DSH8279 要求你按名称编译该源一次;从那时起,其使用者会基于那次编译所写的内容进行构建。

手动编辑

NoGeneration 资产绝不会在你背后被重建,因此对它的手动编辑会在每次不命名该源的编译中保留下来。而命名它的编译是一次普通重建,分歧检查仍会阻止它在未经询问的情况下覆盖手动编辑。

另见

  • 缓存 — 编译让资产保持原样的另一个原因:其构建键是当前的
  • 重新生成 — 重建会对资产做什么
  • 禁用诊断 — 对于一个从不打算自动构建的文件,可以禁用 DSH8278

本页目录