This page has been translated automatically.
视频教程
界面
要领
高级
实用建议
UnigineEditor
界面概述
资产工作流程
设置和首选项
项目开发
调整节点参数
Setting Up Materials
Setting Up Properties
照明
Landscape Tool
Sandworm
使用编辑器工具执行特定任务
Extending Editor Functionality
嵌入式节点类型
Nodes
Objects
Effects
Decals
光源
Geodetics
World Objects
Sound Objects
Pathfinding Objects
Players
编程
基本原理
搭建开发环境
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine Tools
GUI
双精度坐标
应用程序接口
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
创建内容
Content Optimization
Materials
Art Samples
Tutorials
注意! 这个版本的文档是过时的,因为它描述了一个较老的SDK版本!请切换到最新SDK版本的文档。
注意! 这个版本的文档描述了一个不再受支持的旧SDK版本!请升级到最新的SDK版本。

强制着色器编译

着色器是在GPU上执行的小程序,当然需要花费一些时间来进行编译和加载。 通常,编译和加载单个GPU程序不需要花费很多时间,但是着色器通常具有很多“变体”。 复杂的着色器在各种情况下都有多个预处理器指令(定义),这些指令的每种组合都定义了一个着色器变体。 因此,我们最终不得不编译成千上万个稍有不同的GPU程序。 在运行时按需编译着色器会导致冻结,并需要额外的内存。 为了减少这种开销,所有必需的着色器组合都会被解析,编译并存储在着色器缓存中。 从缓存加载预编译的着色器要快得多。

OpenGL的着色器缓存表示将着色器从 UUSL 预先翻译为 GLSL ,而不是编译。它的生成速度是DirectX的 5-10 倍,但使用的磁盘空间是 5-6 倍。

注意
为调试版本生成的DirectX着色器缓存不应用于发行版本,因为着色器编译是在没有优化的情况下执行的。重新生成DirectX着色器缓存以用于您的发行版,以实现最佳性能(通过优化编译确保)。

对着色器缓存没有特殊要求,例如安装或设置任何其他软件。

每次引擎未能从缓存中检索着色器时,所需的着色器都会被编译并自动添加到缓存中。但是,这可能会导致您的应用程序“打h”(冻结一会儿)。对于许多应用程序(例如实时模拟器),这是完全不可接受的。因此,关键是您应该拥有最完整的着色器缓存,其中包含应用程序中使用的所有变体。

注意
应该分别为浮点精度和双精度生成生成着色器缓存,因为它们每个都使用自己的着色器缓存(即,为浮点精度生成的缓存不适合于双精度生成)。如果您的应用程序同时使用float和double版本发布,则必须两次生成着色器缓存。

所有着色器的预编译是一项重要的功能,可确保在您的项目完成并且最终版本可以交付给客户时,您将拥有完整的着色器缓存。这显着减少了最终版本构建中的冻结次数,并平滑了应用程序的帧速率。已为项目中的所有材料预先编译了着色器。

通过加载工具栏上Play按钮附近的工具栏上的Precompile All Shaders按钮或通过加载世界时通过Settings窗口的Editor部分可以使用此功能。

工具栏上和Settings窗口的Editor部分中的Precompile All Shaders选项

您可以通过以下方式之一使用它:

  • 恒定的后台预编译

    启用此按钮后,每次创建新材质时,您将在视口中的着色器编译中看到以下消息:

    注意
    如果通过编译消息上的相应按钮使UnigineEditor的UI响应变得太慢,则可以停止着色器缓存的生成过程。

    尚未为其编译着色器的材质将临时替换为灰色且没有纹理的基础材质。根据您计算机的性能,这可能需要花费几秒钟的时间。此选项可确保您始终具有所选图形API的完整着色器缓存。

  • 按需预编译

    有时,不断进行的着色器后台编译可能会干扰并减慢您的工作速度,这对于某些引擎而言是典型的。 UNIGINE使您可以禁用着色器预编译。您可以在评估最终版本的性能之前启用它。在这种情况下,着色器缓存的生成将花费更多的时间(最多半小时),具体取决于项目的复杂性和所选的图形API。但是它只会执行一次,而不是每次更改材料时都会减慢您的工作。

    注意
    建议图形程序员使用此模式,以在更改材料状态时节省重新编译的时间。

强制着色器预编译可确保为项目中的所有材质提供最完整的独立于世界的着色器缓存。 但是,更改某些本地设置,例如用于大地坐标,地形,水或云的设置(例如,通过Tracker或您的应用程序逻辑更改某些材质状态)仍会导致重新编译着色器,但仅仅是重新编译一种仅针对相应类型的对象执行。

应该执行以下操作来为您的项目生成最完整的着色器缓存:

  1. 打开所有包含大地坐标,地形,水或云的世界。
  2. 对于这些世界,请执行以下操作:
    • -将场景摄影机置于水上,水下和两种介质之间的水线处。
    • 地形-将场景摄像机放在地形上方,然后将其移至地形表面。
    • -将场景摄像机放在云之上,云之下和云内部。
  3. 为所有计划通过应用程序逻辑进行切换的材料状态创建并启动轨道
注意
为了最大程度地减少材质的着色器的运行时重新编译,材质的状态将通过应用程序逻辑进行更改,您还可以创建具有所需状态值的单独材质,并在这些材质之间切换,而不用更改状态。

data文件夹内生成DirectX / OpenGL的输出着色器缓存:

  • shader_d3d11.cache
  • shader_gl.cache
警告
请勿将着色器缓存文件放入UNG存档!由于缓存文件已经使用LZ4压缩,因此文件大小不会显着减少。此外,在这种情况下,可以在最终用户方面生成的新着色器将不会添加到缓存中。

当您的项目完成并且最终版本可以移交给客户时,您应该将两个缓存文件(shader_gl.cacheshader_d3d11.cache)都复制到最终版本的data目录中。

如果您通过命令行或引擎初始化传递了项目名称

命令行
-project_name "YourProject"
您应该将着色器缓存文件复制到以下目录:
  • Windows - C:/Users/<username>/YourProject/
  • Linux - /home/<username>/.YourProject/
最新更新: 2021-04-29
Build: ()