在 vForge 中设置排列组合着色器和技术

前面介绍了如何编写一个着色器。要实际创建该着色器的排列组合,它就必须在 vForge 中设置。

排列组合着色器和普通着色器的唯一差别在于前者包含 $ifdef / $endif 代码,后者没有。 只需在着色器中插入这些排列组合预处理器指令,就能将着色器转变成可以生成排列组合的着色器。 当您保存着色器库时,vForge 会检查着色器代码,以黄色图标标出这些着色器,而其他着色器的图标为蓝色。 使用排列组合技术的着色器无法被分配给非排列组合技术。

   注: 一旦您在着色器中使用排列组合指令,着色器编译器就不再直接编译该着色器。 该着色器本身将被忽略,只有它所生成的排列组合会被编译。

排列组合技术
在 Vision 引擎中,着色器库由 效果构成,效果包含 技术,技术则引用着色器。 要生成着色器的排列组合,您可以使用一个新要素,即 排列组合技术。 排列组合技术引用一个着色器。 该着色器在其代码中使用排列组合变量。

创建一个排列组合技术后,将着色器拖拽到该技术中,或右键单击技术并选择”Set Shader”(设置着色器),即可设置要使用的着色器。 接下来,该技术需要一份配置脚本,定义为该技术创建排列组合的 确切方式。 为此,首先在树状图中选中该排列组合技术。 “着色器属性”窗口会显示该技术的设置。  PermutationConfig 属性可指定配置文件(一个 Lua 脚本)。 点击 … 图标选择一个现有的脚本或创建新脚本。

排列组合配置脚本
创建新配置脚本时,其中包含一些默认代码以帮助您上手。
-- *** Vision Shader-Permutation Config-File ***
 
--   Functions to add Permutation-Variables and their valid Values:
 
-- AddPermutationBool      ("VAR_NAME");
-- AddPermutationBoolGroup ("VAR_NAME1", "VAR_NAME2", "VAR_NAME3", ...);
-- AddPermutationInt       ("VAR_NAME", int1, int2, int3, ...);
-- AddPermutationConst     ("VAR_NAME", true/false);
-- AddPermutationConst     ("VAR_NAME", int);
-- AddPermutationConstWithIncTag ("VAR_NAME", true/false);
-- AddPermutationConstWithIncTag ("VAR_NAME", int);
 
--   The following global variables are available:
 
-- EffectName
-- TechniqueName
 
--   The following Permutation-Variables were extracted from the Shader:
 
-- AddPermutationBool/Int/Const ("PERM_VAR");
 
 
--   Filtering-Function to remove unnecessary permutations:
 
function IsPermutationSupported (PermutationValues, Platform)
 
--if (PermutationValues["VAR_NAME"] > some_value) and (Platform == DX9 / DX11 / XBOX360 / PS3 / PSP2 / GLES2) then
--  return false;
--end
 
--if (PermutationValues["VAR_NAME"] ~= some_value) and/or (PermutationValues["VAR_NAME"] == some_other_value) then
--  return false;
--end
 
  return true;
end
 
vForge 甚至会解析当前被排列组合技术使用的着色器,并自动插入代码,对辨识出的排列组合变量进行配置。 正如您在上面的示例中所见,vForge 会辨识出着色器使用了  PERM_VAR 变量,并为您添加一些代码,使其正常起效并运行得更快。

该脚本已经记录了排列组合系统具有的所有功能。 该脚本为 Lua 脚本,所以使用正常Lua 语法。

这些脚本中最重要的部分是调用  AddPermutation…。 通过这些调用,您可以让着色器编译器了解所有排列组合变量,以及它们应具有的类型和值。

AddPermutationBool 添加一个布尔排列组合变量。 这些变量使用 true 和 false 值。
AddPermutationInt 添加一个整数排列组合变量。 您必须指定所有要获取的值。
AddPermutationConst 添加一个变量,但将其设为某个常数值,可以是 true/false,也可以是单个整数值。 该排列组合变量不会被添加到包含标记列表中。
AddPermutationConstAndIncTag 该排列组合变量会被添加到包含标记列表中(如果为 true(布尔)或任意整数值),除此之外和”AddPermutationConst”相同。
AddPermutationBoolGroup 添加多个布尔排列组合变量,并设置限定,其中只能有一个为 true。
  注: 您可以添加比着色器使用的排列组合变量更多的排列组合变量。 着色器编译器会生成更多排列组合,但会检测出这些不必要的排列组合的着色器代码是重复的,并将这些排列组合转为对同一着色器的引用。

脚本还包含过滤函数  IsPermutationSupported。 该函数可过滤掉不被特定硬件支持或无意义的排列组合。

该函数带有  PermutationValues 参数,这是一份表格,表格中,每个排列组合变量各有一个值。 此外,函数还带有一个参数,描述当前生成的排列组合用于哪种平台。 然后函数检查具体配置,判断脚本是否被支持,并返回 true 或 false 结果。

例如,您有一个支持法线贴图和视差贴图的着色器,而视差贴图必须在启用法线贴图的前提下才能执行。 因此,启用视差贴图但禁用法线贴图的排列组合是无用的。 IsPermutationSupported 可过滤掉这一配置,从而加快编译速度,也有可能减少着色器库的内存占用。

另一用途是过滤掉某些平台无法运行的特定排列组合。 例如,某些主机无法执行 PC 上可以执行的复杂着色器。 一个着色器效果可能有若干排列组合,其细节从非常简单一直到极度复杂,但不能为这些主机编译细节度极高的排列组合,因为主机无法渲染。

如果没有  IsPermutationSupported,所有排列组合都会被创建,没有一种会被弃用。

该脚本还传递了”EffectName”和”TechniqueName”变量,其中包含脚本当前执行的效果和技术的名称。 通过这些变量可在不同技术中使用相同的脚本,不过代码还是会略有不同。
 AddPermutationBool ("NORMALMAP");
 
  if (TechniqueName == "MSAA") then
    AddPermutationInt ("MSAA_LEVEL", 2, 3, 4);
  else
    AddPermutationConst ("MSAA_LEVEL", 1);
  end
 
创建和验证排列组合
当您有了一个排列组合技术,其中具备排列组合着色器和有效的配置脚本,您只需保存(也就意味着编译)着色器库即可生成排列组合。

有若干功能可帮助您判断排列组合是否会按配置意图正确生成。 首先,您可以轻易地显示一种技术所生成的配置:

对话框会显示将生成哪些排列组合、如何生成,以及其中是否有任何重复(即排列组合的代码完全相同)。 进一步展开节点,您甚至可以检查着色器将被生成的代码。 而且,如果配置脚本或着色器中有任何错误,对话框会向您提示。

当您编译着色器库时,着色器日志会显示大量信息,例如哪些排列组合被生成、哪些配置被使用,等等。 该日志通常仅在着色器编译失败时显示。 但您可以在着色器勾选项菜单中勾选 “Always Show Log”(始终显示日志),确保日志始终被显示:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值