2024年10月24日

Evergine中的新Library Effect

最新的Evergine版本引入了一项强大的新功能:Library Effect资产。这种新型效果旨在提高代码可读性,并实现跨项目复用。在开发多个效果时,您可能会注意到一些重复的模式或希望复用的共享工具函数。现在,借助Library Effect,这不仅是可能的,而且非常简单。

什么是Library Effect?  

Library Effect充当静态变量、常量、指令和可复用函数的集合,可在您的Graphics和Compute效果中引用。只需在效果文件中包含该库,您就可以集中管理共享逻辑,保持效果代码库的整洁和可维护性。

创建Library Effect

您可以从Evergine Studio资产菜单创建新的Library Effect,或右键单击资产详情面板并选择相应选项。

定义Library Effect

每个新的Library Effect都必须以[Begin_Library]元标签开始,并以[End_Library]元标签结束。Library Effect的编译方式与其他任何效果相同,因此您需要指定编译配置文件版本,就像定义通道时一样。这确保了即使在库被其他效果使用之前,任何潜在问题都能被及早发现和调试。 

构建您的库

在Library Effect内部,您可以定义希望在Graphics或Compute效果中复用的公共变量、常量和函数。在下面的示例中,创建了一个Tonemapping库,其中包含实现ACES色彩调整的逻辑。 

在其他效果中使用Library Effect

要在 Graphics 或 Compute 效果中使用库效果,只需使用以下元标签将其包含进来: 

[Include_Library LibraryName LibraryIdentifierNumber] 

  • LibraryName: 库的可读名称。 
  • LibraryIdentifierNumber: 用于标识库效果资源的唯一 GUID。

使用 GUID 的优势在于它独立于资源的相对路径。这意味着您可以在项目的资源文件夹中移动库资源,而不会破坏引用。

为了更轻松地在效果中包含库,您可以从资源详情面板将库效果资源拖放到效果编辑器中打开的另一个效果中。此操作将自动在您的代码中创建引用。 

示例:在 Graphics 效果中使用色调映射库

以下示例展示了如何在 Graphics 效果中使用之前定义的 MyLibrary。

库效果依赖与递归包含

库效果也可以引用其他库效果,使您能够通过组合多个库来构建更复杂的效果。这种方法有助于将代码组织成逻辑依赖树,并确保更好的模块化和关注点分离。 

在库效果中使用指令

您可以在库效果中利用指令来控制 HLSL 代码的流程,从而根据这些指令的值创建库的多种变体。 

当您将库效果导入 Graphics 或 Compute 效果时,其指令也会被导入,并与效果本身及其所有依赖库的指令合并。这将形成一个效果可以使用的单一、统一的指令组。 

使用效果分析器管理错误

Evergine 效果编辑器已通过新的效果分析器得到增强,该分析器可提供有关新的[Include_Library]元标签的详细信息,并帮助您管理使用库效果时可能出现的任何问题。以下是一些常见场景以及效果分析器如何处理它们: 

  1. 未解析的引用:如果包含的库的库标识符编号不正确,分析器将报告无法解析对该库的引用。
  2. 库编译错误:如果您的库效果包含错误或代码错误,分析器将在主效果中高亮显示包含行,并在库内部显示错误。
  3. 交叉引用问题:如果一个效果包含了一个库,而该库又包含了另一个库,并且检测到循环依赖,分析器将报告交叉引用问题。

结论

库效果加入 Evergine 为效果开发开辟了新的可能性,使您能够更好地构建、优化和重用 HLSL 代码。凭借对递归包含、指令和增强的错误处理的支持,库效果为构建复杂的渲染管线提供了强大的工具集。

快来试试,看看它如何简化您的着色器开发流程! 

Jorge Canton
作者
Jorge Cantón
Plain Concepts Research