## 概述 该工具的目的是生成 rendinst 模型的 impostor 纹理,以导出到游戏资源包中。 ## 本地工作流 该工具是一个单独的可执行文件。现有的 daBuild 是控制台应用程序,因此它不支持渲染资源。 冒名顶替者纹理的生成发生在构建资源之前,因此生成的纹理也会导出 1. 生成 impostor 纹理。 2. 使用 daBuild 构建资源(在本地测试它们)。 3. 提交更改: - `.folder.blk`, 用于树, - 生成的纹理(每个 rendinst 有 3 个), - `riImpostors.bin` 文件,这些文件被修改(位于 //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`(在`/develop/`中) 5. 运行 daBuild。 必要的包(或只是构建所有内容)是: - `vegetation.grp` (或受影响的树木导出到的任何位置) - `_impostors.dxp` (如果不同的文件夹中有树,可能会有更多) - `impostor_data.impostorData.blk`文件的 `.grp`。位置在`application.blk`文件中指定: `assets/impostor_data_folder:t=...` 文件中指定的位置。 6. (可选)导出关卡二进制文件。 游戏在没有此选项的情况下运行,但旋转调色板将不可用。 如果没有此步骤,则在加载关卡时将出现 logerr。它并不危险,可以安全地忽略,但在关卡二进制导出后,关卡看起来会略有不同。 上传到 cvs 时,必须包括生成的冒充者文件夹(/impostors/)中所有生成的纹理 + `.folder.blk`;以及 `impostor_data.impostorData.blk` 文件,当然还要修改 `.folder.blk`。 ## 如何访问该工具 以下是有关如何访问该工具的说明。 ## Impostor 纹理分辨率 每个资产的纹理大小可在 `application.blk` 或 `.folder.blk` 中指定。 - 在 `application.blk`中: 纹理高度可以全局指定,也可以基于世界空间树高度使用质量级别指定。纹理的宽度将根据树的世界空间高/宽比计算。宽树将具有宽纹理。有关配置,请查看本页末尾。 ```{seealso} For more information, see [application.blk](../../assets/all-about-blk/application_blk.md). ``` - 在`.folder.blk`中: 这里可以指定精确的分辨率。如果只指定了高度,宽度将根据树的世界空间高度/宽度比来计算。`impostor{}`块选项的`textureWidth`和 `textureHeight`选项对应的是整个生成纹理的分辨率,而不是每个切片的分辨率。生成的纹理将连续包含 9 个视图,但它们会被压缩。 ```{seealso} For more information, see [.folder.blk](../../assets/all-about-blk/folder_blk.md). ``` 请记住,纹理分辨率选项将应用于最高的 *hq* 纹理配置。这些分辨率应该是当前游戏应该使用的分辨率和最高质量选项。Mip 偏移量适用于 mq* 和 *lq*,也可以选择应用于移动分发。 如果要为特定平台指定纹理质量,则必须更改 `impostors/.folder.blk`。生成的纹理适用于所有平台。可以使用 `.folder.blk`导出带有 mip 偏移的纹理。 在没有特定项目选项之前,最好更新 `impostorBaker.cpp` 以生成不同的默认 `.folder.blk`。 ### 如何使用该工具 ### 使用独立工具 该工具需要在 `develop/` 目录下执行才能工作。它需要两个必选参数:`application.blk` 的路径和根目录的路径: ```text > G:/dagor2/tools/dagor3_cdk/bin64/impostorBaker-dev.exe ../application.blk -rootdir:G:/dagor2/enlisted/develop [options...] ``` 选项是: - `debug:`: `classic` 或 `default`,设置调试模式。 - `assets:`: 资产名称可以在此处列出(RendInst 类型),用 `;` 分隔。该工具将导出这些资源。 - `packs:`: 这些包中具有 Impostor 的资产将被导出。 - `clean:`: 可用于删除属于不再存在的资源的所有纹理。默认值: `no`. - `folderblk:`: 指定如何处理 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](../asset-viewer/asset-viewer/asset_viewer.md) 启动时存在 impostor 纹理时,才会显示这些纹理。如果冒名顶替纹理是从 [Asset Viewer](../asset-viewer/asset-viewer/asset_viewer.md) 生成的,则它们只会在重新启动后出现在资产中。 ``` 让图像自己说话: Using the Asset Viewer ## 如何启用资源的 Impostor 纹理生成 首先,资源必须是`rendinst`类型,否则工具将跳过它。 向虚拟资产的内容添加`impostor{}`块。`impostor{}`块 **必须直接位于`contents{}`块内**,而不是在第三个块内。目前不支持 baked/runtime impostor duality。无法为不同的构建配置(例如不同的平台)设置不同的 impostor 类型。此功能是可行的,但尚未实现。 **示例:** ```text 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)     }     //...   } } ``` 或者只是简单地 ```text 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} 一次只能指定`defaultTextureHeight` 和 `textureQualityLevels` 中的一个。 ``` - `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** ```text 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 } } } ``` 4. 打开相应的 `gameParams.blk` 5. 删除此行(如果存在): `enableImpostorTextureManager:b=false (default=yes)` 6. (可选)添加以下行以禁用 preshadow 压缩: `enableImpostorPreshadowCompression:b = (default=yes)` 7. 配置 cascade0 外部的透射率近似参数: ```text 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 光照颜色仅适用于树枝,不包括棕榈树、橄榄、有光泽的树叶等。 ```text 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 将用于采样。 **示例:** ```text 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. 将整个数据导出到游戏。