概述

该工具的目的是生成 rendinst 模型的 impostor 纹理,以导出到游戏资源包中。

本地工作流

该工具是一个单独的可执行文件。现有的 daBuild 是控制台应用程序,因此它不支持渲染资源。

冒名顶替者纹理的生成发生在构建资源之前,因此生成的纹理也会导出

  1. 生成 impostor 纹理。

  2. 使用 daBuild 构建资源(在本地测试它们)。

  3. 提交更改:

    • .folder.blk, 用于树, - 生成的纹理(每个 rendinst 有 3 个),

    • riImpostors.bin 文件,这些文件被修改(位于 <content_folder>/<package_folder>/res/ 中)。

本地工作流:快速入门

  1. 要启用烘焙冒名顶替者,请查看.folder.blk文件中的此类虚拟资产:

    virtual_res_blk{ find:t="^(.*bush.*)\.lod00\.dag$"...}

  2. 将下面这行

    lod { range:r=1000; fname:t="../dynamic_imposter.lod01.dag";}

    替换为

    lod { range:r=1000; fname:t="../billboard_octagon_impostor.lod01.dag";}

  3. 添加 impostor{} 块(查看页面末尾的更多详细信息)。

  4. 运行 daImpostor.cmd(在<game_folder>/develop/中)

  5. 运行 daBuild。

    必要的包(或只是构建所有内容)是:

    • vegetation.grp (或受影响的树木导出到的任何位置)

    • <trees_foldername>_impostors.dxp (如果不同的文件夹中有树,可能会有更多)

    • impostor_data.impostorData.blk文件的 .grp。位置在application.blk文件中指定: assets/impostor_data_folder:t=... 文件中指定的位置。

  6. (可选)导出关卡二进制文件。

    游戏在没有此选项的情况下运行,但旋转调色板将不可用。 如果没有此步骤,则在加载关卡时将出现 logerr。它并不危险,可以安全地忽略,但在关卡二进制导出后,关卡看起来会略有不同。

    上传到 cvs 时,必须包括生成的冒充者文件夹(<trees_folder>/impostors/)中所有生成的纹理 + .folder.blk;以及 impostor_data.impostorData.blk 文件,当然还要修改 .folder.blk

如何访问该工具

以下是有关如何访问该工具的说明。

Impostor 纹理分辨率

每个资产的纹理大小可在 application.blk.folder.blk 中指定。

  • application.blk中:

    纹理高度可以全局指定,也可以基于世界空间树高度使用质量级别指定。纹理的宽度将根据树的世界空间高/宽比计算。宽树将具有宽纹理。有关配置,请查看本页末尾。

    See also

    For more information, see application.blk.

  • .folder.blk中:

    这里可以指定精确的分辨率。如果只指定了高度,宽度将根据树的世界空间高度/宽度比来计算。impostor{}块选项的textureWidthtextureHeight选项对应的是整个生成纹理的分辨率,而不是每个切片的分辨率。生成的纹理将连续包含 9 个视图,但它们会被压缩。

    See also

    For more information, see .folder.blk.

请记住,纹理分辨率选项将应用于最高的 hq 纹理配置。这些分辨率应该是当前游戏应该使用的分辨率和最高质量选项。Mip 偏移量适用于 mq* 和 lq,也可以选择应用于移动分发。

如果要为特定平台指定纹理质量,则必须更改 impostors/.folder.blk。生成的纹理适用于所有平台。可以使用 .folder.blk导出带有 mip 偏移的纹理。 在没有特定项目选项之前,最好更新 impostorBaker.cpp 以生成不同的默认 .folder.blk

如何使用该工具

使用独立工具

该工具需要在 develop/ 目录下执行才能工作。它需要两个必选参数:application.blk 的路径和根目录的路径:

> G:/dagor2/tools/dagor3_cdk/bin64/impostorBaker-dev.exe ../application.blk -rootdir:G:/dagor2/enlisted/develop [options...]

选项是:

  • debug:<value>: classicdefault,设置调试模式。

  • assets:<asset_name1;asset_name2...>: 资产名称可以在此处列出(RendInst 类型),用 ; 分隔。该工具将导出这些资源。

  • packs:<pack_name1;pack_name2...>: 这些包中具有 Impostor 的资产将被导出。

  • clean:<yes|no>: 可用于删除属于不再存在的资源的所有纹理。默认值: no.

  • folderblk:<disabled|dont_replace|replace>: 指定如何处理 impostor 目录中的 .folder.blk文件:

    • disabled: 切勿生成或修改这些文件;

    • dont_replace: 如果不存在,则生成 .folder.blk;

    • replace (默认值):始终生成或替换现有项。

如果设置了 assets 或 packs 选项,则只会生成这些资源。 否则,所有支持的资产(rendinst 都有一个impostor{}块)。如果检测到无效参数,应用程序将打印出包含所有这些参数的帮助菜单。

该工具将在每个目录中创建一个目录,其中包含支持冒名顶替者的 rendinst。纹理和.folder.blk文件(取决于设置)将在生成时放置在此目录中。

Note

不要在该目录中放置任何其他内容,因为它的内容是自动处理的。如果启用了 clean 选项,它将解析所有 impostor 目录,以及这些目录中的所有文件名。它将保留属于支持冒名顶替者的现有资产的所有文件;它将删除所有与 Impostor 纹理名称格式匹配的纹理,这些纹理不属于任何此类资源;在此步骤中忽略 .folder.blk 文件;如果找到任何其他文件,则清理作将中止以防止意外删除必要的文件。

使用 Asset Viewer

Note

仅当 Asset Viewer 启动时存在 impostor 纹理时,才会显示这些纹理。如果冒名顶替纹理是从 Asset Viewer 生成的,则它们只会在重新启动后出现在资产中。

让图像自己说话:

Using the Asset Viewer

如何启用资源的 Impostor 纹理生成

首先,资源必须是rendinst类型,否则工具将跳过它。

向虚拟资产的内容添加impostor{}块。impostor{}必须直接位于contents{}块内,而不是在第三个块内。目前不支持 baked/runtime impostor duality。无法为不同的构建配置(例如不同的平台)设置不同的 impostor 类型。此功能是可行的,但尚未实现。

示例:

virtual_res_blk{
  find:t="^(.*tree_tropic_large_.*)\.lod00\.dag$"
  className:t="rendInst"
  contents{
    impostor{
      textureWidth:i=4096
      textureHeight:i=0 // 根据资产高度自动调整为宽度(适用于树木/灌木丛)
      rotationPaletteSize:i=3
      mipCount:i=0 // 0 表示生成所有,直到指定的最小 mip 大小 (application.blk)
    }
    //...
  }
}

或者只是简单地

virtual_res_blk{
  find:t="^(.*tree_tropic_large_.*)\.lod00\.dag$"
  className:t="rendInst"
  contents{
    impostor{} // 自动检测冒名顶替者类型;使用默认设置
    //...
  }
}

impostor{}块中的任何参数都可以省略以使用默认值。该块也可以为空。该工具将生成一个纹理,该纹理由切片组成,对应于资源的不同视角。

  • textureWidth: 包含 9 个切片的整个纹理的 X 分辨率。

  • textureHeight: 生成的纹理的 Y 分辨率 = 单个切片的高度。

  • mipCount: 默认情况下(值 = 0),它将根据 application.blk 设置生成所有 MIP。任何不同的值都将手动覆盖它。它表示包括基本纹理在内的 mip 级别的总数。

  • rotationPaletteSize: 树将能够绕 Y 旋转,但只允许几个离散角度。对于 rotationPaletteSize=3,可能的旋转将是 0°、120°、240° 度。

    Warning

    将为每棵树的每个可能的旋转创建一个阴影纹理。

  • preshadowsEnabled: 为此资产启用 preshadows。

  • crownCenterOffset1: 透射椭球体中心的 Point3 偏移量,以米为单位。

  • crownRadOffset1: 透射椭球半径的 Point3 偏移量(以米为单位)。

  • crownCenter2: Point3 次级透射椭球体中心,以米为单位。

  • crownRad2: Point3 次透射椭球半径(以米为单位)。

  • mipOffsets_hq_mq_lq:ip3=0,1,2: 这些 MIP 偏移量将直接导出到 .tex.blk 文件。这些选项仅影响 daBuild。

  • mobileMipOffsets_hq_mq_lq:ip3=0,1,2: 与 mipOffsets_hq_mq_lq相同,只是它适用于移动平台。如果项目不是为移动设备构建的,则无需指定它。

  • impostorNormalMip:i=5: 有一种方法可以告诉工具哪个 Mip 将用于烘焙此资产的法线。默认情况下,它是 0

默认值可在以下位置找到: prog/gameLibs/publicInclude/rendInst/impostorTextureMgr.h

如何在新游戏中启用 Baked Impostors

  1. 将复制当前billboard_octagon_impostor.lod01.dag件添加到资产目录中有 dynamic_imposter.lod01.dag文件的每个位置。如果已经有一个,请检查它是否相同。

  2. application.blk中启用impostorData资产类型:

    • assets{ types{ type:t="impostorData"}}

    • assets{ export{ types{ type:t="impostorData"}}}

  3. application.blk中添加assets{impostor{}}块:

    • data_folder:t: mandatory,请选择始终为游戏导出的位置(不依赖于关卡或类似位置)。相应的.grp不能包含任何使用烘焙冒名顶替者的资产。

    • splitAt:i: 可选的 splitAt 值为 impostor 纹理。它将用于导出项目中的所有 impostor 纹理。

    • defaultTextureHeight:i: 可选的,生成的 Impostor 纹理的默认纹理高度。它可以在 virtual_res{}块中被覆盖。

    • textureQualityLevels{ qualityLevel{ minHeight:r=; textureHeight:i= }}}: 基于世界空间树高度的纹理高度列表。textureHeight将应用于至少为minHeight 高的树。可以指定多个 qualityLevel 块。

      Important

      一次只能指定defaultTextureHeighttextureQualityLevels 中的一个。

    • mobileMipOffset:i: 可选,如果游戏的移动版本需要比 PC 更小的分辨率纹理,则可以使用此选项对它们应用 MIP 偏移。纹理可以以 PC 分辨率生成,移动设备将将它们与给定的 mip 偏移量一起使用。

    • normalMipOffset:i: 使用normal_translucency纹理时,其分辨率将低于漫反射纹理。

    • aoSmoothnessMipOffset:i: 与 normalMipOffset:i 相同,但适用于 ao_smoothness 纹理。

    • aoBrightness:r: impostor AO 效果的亮度默认值: 0.7.

    • aoFalloffStart:r: lower 表示impostor AO 效果的中心较暗 (0..1) 默认值: 0.25.

    • aoFalloffStop:r: lower 表示impostor AO 效果的边缘较暗(0..1) 默认值: 1.0.

    • preshadowsEnabled:b: 默认情况下,启用或禁用此项目的 preshadows。可以按资产覆盖它。Preshadows 通常会以牺牲性能为代价来提高质量,尽管它们并不适用于每个资产。默认值: yes.

Example

impostor{
  data_folder:t="develop/assets/gameres/gameObjects"
  preshadowsEnabled:b=yes
  splitAt:i=256
  mobileMipOffset:i=1
  normalMipOffset:i=1
  aoSmoothnessMipOffset:i=1
  textureQualityLevels{
    qualityLevel{
      minHeight:r=0; textureHeight:i=32
    }
    qualityLevel{
      minHeight:r=4; textureHeight:i=64
    }
    qualityLevel{
      minHeight:r=8; textureHeight:i=128
    }
    qualityLevel{
      minHeight:r=16; textureHeight:i=256
    }
  }
}
  1. 打开相应的 gameParams.blk

  2. 删除此行(如果存在):

    enableImpostorTextureManager:b=false (default=yes)

  3. (可选)添加以下行以禁用 preshadow 压缩:

    enableImpostorPreshadowCompression:b = <yes/no> (default=yes)

  4. 配置 cascade0 外部的透射率近似参数:

treeCrownTransmittance{
  brightness:r    // default = 0.5
  falloffStart:r  // default = 0.01
  falloffStop:r   // default = 1.
  enabled:b       // default = no
}

如何使用 ImpostorNormalMip 进行 Smoothness Hack

黑客的想法。在分支的某个 mip 处,法线纹理放置相同的纹理,但具有淡化平滑度通道。之后,用这种纹理烘烤 impostor,结果我们在游戏 impostor 中看到边缘的白色东西较少。

  1. 为植被的树枝的正常纹理设置 mipFade 功能,例如,将 4 mip 设置为淡化

    Important

    您应该根据重排指定 mipFade。

    如下例所示,此处我们希望平滑度通道的 mip 淡入淡出,该通道存储在 Alpha 通道中。但根据 swizzling Alpha 通道进入 Red 通道。因此,我们将 mip 淡化应用于红色通道。

    示例:

    A 通道(平滑度)的自定义 mipmap 光照颜色仅适用于树枝,不包括棕榈树、橄榄、有光泽的树叶等。

    virtual_res_blk{
       find:t="^(.*branch.*_n?)\.tif$"
       //此处排除有光泽的叶子
       className:t="tex"
       contents{
         hqMip:i=1; mqMip:i=2; lqMip:i=3
         convert:b=yes; fmt:t="BC7"
         rebuild_bc67:b=yes
         gamma:r=1
         stubTexTag:t="smooth0_nx_metal0_ny"
         mipFilter:t="filterKaiser"; mipFilterAlpha:r=42; mipFilterStretch:r=2 
         addrU:t="wrap"; addrV:t="wrap"
         hqMip:i=0; mqMip:i=1; lqMip:i=2
         swizzleARGB:t="RAGB"
         mipFade{
          mipFadeColor:p4=1.0,-1,-1,-1
          mipFadeStart:c=0,0,0,0
          mipFadeEnd:c=4,4,4,4
        }
      }
    }
    
  2. 导出此导出,以应用 mipFade 功能的更改。

  3. 为 tree 的每个资产设置一个 mip,该 mip 将用于采样。

    示例:

    virtual_res_blk{
      find:t="^(tree_autumn_.*)\.lod00\.dag$"
      className:t="rendInst"
      contents{
        lod{
          range:r=80;
        }
        lod{
          range:r=160;
        }
        lod{
          range:r=1500;
          fname:t="../billboard_octagon_impostor.lod01.dag";
        }
        transition_lod{
          ...
        }
        impostor{
          impostorNormalMip:i=5;
        }
        allowProxyMat:b=yes
      }
    }
    
  4. 运行 Impostor Baker,以烘培Impostor。

  5. 将整个数据导出到游戏。