自定义纹理分支

创作者: TaxTalis
已更新:2024-05-30 09:36:27
15KB

关于此 MOD

允许你用自定义png文件替换游戏纹理实例。
这是以下内容的分支 艾登索恩的自定义纹理,据我所知,已修复适配当前的Ashlands版本。
一切归功于原作者。
我刚接触英灵神殿模组制作,基本上是在盲目摸索。在我自己的游戏里测试过可以正常运行,但我无法保证任何情况。

可能需要删除旧配置才能让这个模组重新生效。


地面纹理未能正确替换,将回退为原版纹理。
这是一个已知问题,可能超出了我的修复能力范围。



描述

这个模组应允许你替换以下内容:

  • 玩家模型纹理
  • 物品栏图标
  • 盔甲、武器和工具等装备纹理
  • 地形和水面纹理
  • 环境纹理
  • 特殊地点纹理(村庄、地穴、符文石等)
  • 世界物体纹理,游戏中几乎其他所有内容

现在还支持图层,因此你可以将多个纹理应用到同一个原版纹理上(见下文“图层”部分)。

要创建你自己的自定义纹理,需要基本的阅读理解能力!这并不难,但在寻求帮助之前,请仔细阅读以下所有信息。


基本用法

为了提取原版纹理作为参考,我使用 资产工作室纹理位于 valheim_Data/sharedassets 文件中。

要替换纹理,只需将 png 文件添加到 BepInEx/plugins/CustomTextures 文件夹中,并使用下面说明的正确命名格式,然后加载游戏即可。

你也可以将纹理整理到子文件夹中!如果你要发布纹理包,我鼓励你这样做,以便于安装和删除。

另外,如果你要发布材质包,在创建 zip 文件之前将材质放入 CustomTextures 文件夹,Vortex 就能自动安装它们!

在游戏过程中重新加载世界纹理有一个快捷键(默认为Page Down)。注意:这不会重新加载任何原版纹理,因此如果你删除了自定义纹理文件,必须重启游戏才能再次看到原版纹理。

关于使用此模组创建自定义纹理的模组列表,请点击本描述上方的“要求”。

这是某位好心人制作的视频,讲解如何将此模组与预制纹理包配合使用。


筛选模式

Valheim 的纹理使用点过滤,因此在近距离观看时会显得像素化。如果你想为更高分辨率的纹理使用双线性或三线性过滤,请将你的纹理放在名为 bilinear 或 trilinear 的子文件夹中,模组会为这些纹理更改过滤模式(如果你愿意,它们仍然可以放在次级子文件夹中)。


文件命名摘要

文件名最多由四部分组成:前缀、标识符、属性名和层级名。要获取其中大部分信息,请使用场景转储(参见下方的场景转储)。

你创建文件名时以某个前缀开头,通常后跟一个下划线,接着是一个标识符,然后是属性名(可选后跟一个下划线和层名,详见“层”部分),即完成一次完整的纹理替换:

<prefix>_<identifier><propertyName>.png

或用于图层:

<prefix>_<identifier><propertyName>_<layerName>.png

你最终会得到这样一个文件名,然后把它放到CustomTextures文件夹中的某个位置。

属性名通常以下划线开头,所以也别忘了这一点。另外,如果你的Windows隐藏了文件扩展名,不要
在末尾加上.png,否则你会得到一个名为<prefix>_<identifier><propertyName>.png.png的文件,这样是无法使用的。说真的,让Windows显示文件扩展名吧,它默认不显示这点真的很蠢。

以下是四个部分各自的解释:

前缀

以下前缀是根据所修改内容的类型来实现的:

  • 用于玩家纹理的玩家模型
  • 物品栏图标用的图集物品图标
  • 用于对象纹理的对象
  • 盔甲纹理用盔甲
  • 水域纹理区域
  • 用于地形纹理的地形
  • 环境纹理的环境
  • 特殊地点的位置

对于物体、水体、地形、环境和位置纹理,前缀可以进一步修改如下:

  • <prefix>renderer - 用于替换特定命名事物上特定命名渲染器的纹理
  • <prefix>mat - 用于替换特定命名物体上特定命名材质的纹理
  • <prefix>renderermat - 用于替换特定命名事物上特定命名渲染器上特定命名材质的纹理
  • <prefix>纹理 - 用于替换特定命名对象上的特定命名纹理

例如:

environmentrenderermat_YggdrasilBranch_branch_yggdrasil_branch (Instance)_MainTex.png

将替换世界树环境对象上树枝渲染器的yggdrasil_branch(实例)材质的主纹理。

你还可以根据组件名称使用以下前缀:

  • 用于通用替换纹理的纹理(在支持的情况下)
  • 用于替换任何命名渲染器上纹理的渲染器
  • 用于替换任何命名材质纹理的匹配器:
那么,实现上述操作的一些更简单的方法是:

树皮纹理_d_MainTex.png
世界树之枝(副本)_主纹理.png


标识符

你可以在场景转储中找到与上述前缀一起使用的标识符。更多内容请参见下方各详细章节。


属性名称

你可以在场景转储中找到属性名称。通常你需要替换_MainTex,可能还有_BumpMap或_SkinBumpMap。


图层名称:

见下方图层。


替换类型

以下是每种替换类型的详细信息:

玩家纹理

对于基础玩家角色纹理,请使用以下语法:

player_model_<modelNumber><suffix>.png

将<modelNumber>替换为0(男性)或1(女性)。例如:

player_model_1_MainTex.png


物品栏图标

这些是显示在你物品栏中代表游戏内物品的小图标。它们全部位于一张名为sactx-2048x2048-Uncompressed-IconAtlas-61238c20 #845的图形上。

要替换物品栏图标表,请创建一个同等的表,命名为:

图集物品图标.png

你可以使用任何分辨率,它会自动缩放以适配。

你也可以使用图层来替换单个物品图标(参见下方的“图层”部分)。


物体与护甲纹理

注意: 装备和场景物体现在都统一视为物体。模组仍会识别items_前缀,仅为向后兼容。

除了玩家模型和物品栏图标,此模组影响的其他一切均视为对象。

例如:

  • 像煤炭和木材这样的资源
  • 锤子和耕耘机之类的工具
  • 植物、树木、灌木
  • 积木
  • 敌人

护甲是指你穿上它时的外观(而不是和其他破烂一起扔在地上时的样子)。


所有这些内容的通用文件名语法是:

{前缀}_{标识符}{后缀}.png


前缀:

以下对象和护甲的前缀现已实装:

  • 对象 - 用于更改特定世界对象类型上所有类型为 <suffix> 的纹理。<identifier> 应为对象生成名称
  • objectrenderer(objectmesh 也可用,但已弃用)——用于更改特定对象上特定渲染器中所有类型为 <suffix> 的纹理。<identifier>(参见标识符)应为对象名称和渲染器名称,以下划线分隔:<objectName>_<rendererName>
  • objecttexture - 用于更改特定对象上每个渲染器中类型为 <suffix> 的特定命名纹理。<identifier>(参见标识符)应为对象名称与纹理名称,以下划线分隔:<objectName>_<textureName>
  • objectmat - 用于更改特定对象上所有指定名称材质的纹理。 <identifier>(参见标识符)应为对象名称和材质名称,用下划线分隔:<objectName>_<materialName>
  • objectrenderermat - 用于更改特定对象上特定渲染器上特定命名材质的纹理。其中 <identifier>(参见标识符)应为对象名和材质名,以下划线分隔:<objectName>_<rendererName>_<materialName>
  • 纹理 - 用于更改所有使用该纹理的对象和物品上类型为<suffix>的特定纹理的所有实例。<identifier>(见标识符)应为纹理名称(不一定是导出的文件名!)
  • 渲染器 - 用于更改所有对象和物品上特定渲染器所有实例中类型为<suffix>的纹理。<identifier>(参见标识符)应为渲染器名称。
  • 材质 - 用于更改所有对象和物品上特定材质所有实例中类型为<suffix>的纹理。<identifier>(参见标识符)应为材质名称。
  • 护甲 - 用于更换护甲物品的胸部或腿部 - 请注意,护甲的其余部分受object_影响,而非此项。


后缀:

注意:后缀已全面更新。旧的 _texture 和 _bump 后缀仍可识别,但应替换为实际属性名称。

后缀告诉模组你想替换哪个纹理,这些后缀被称为“属性”。

场景转储会列出对象上每种材质的属性列表,例如:

对象ArmorIronChest有1个SkinnedMeshRenderer:
    蒙皮网格渲染器名称:IronArmor
        精炼铁甲有1种材料
            铁甲胸甲材质(实例):
                属性:
                    主纹理铁甲胸甲_ d
                    _凹凸贴图 铁甲胸甲_n
                    自发光贴图
                    金属光泽贴图 铁甲胸甲_m
                    样式纹理
护甲ArmorIronChest拥有材质:
    护甲名称:IronArmorPlayer_chest
                属性:
                    主纹理
                    铁甲胸甲玩家胸部贴图
                    铁甲胸甲玩家
                    铁甲胸甲玩家
                    腿部凹凸贴图
                    金属腿
                    _腿部纹理
                    皮肤凹凸贴图

此对象同时具有蒙皮网格渲染器和护甲材质。它们是分开的。

这物体是粘在玩家身上的那些花哨玩意儿。

护甲是贴在玩家腿部和胸部的纹理。

每个属性都会显示其纹理名称(如果有的话),例如对象的 _MainTex 名称为 IronArmorChest_d。

_MainTex 指的是主纹理。大多数情况下,这就是你想要替换的那个。但对于护甲来说,替换 _MainTex 可能不会起作用——用透明纹理替换它似乎效果最好。要更改实际的护甲,你需要使用 _ChestTex 和 / 或 _LegsTex,并确保它只覆盖实际护甲的区域(参见导出的 IronArmorChestPlayer_m.png 示例)。因此,你需要创建以下内容:

铁甲胸部主纹理.png
护甲_铁护甲胸甲_胸甲纹理.png

护甲系统挺复杂的,最好自己多试试!


标识符

要获取对象的标识符,请使用此处生成列表中的名称:

https://www.reddit.com/r/valheim/comments/lig8ml/spawn_item_command_list/

他们也会出现在上述的场景转储中。


水和地形纹理

水和地形纹理使用与物体类似的语法,即:

<prefix>_<identifier><suffix>.png


水

水纹理位于区域对象内部,因此在场景转储中你现在会看到:

区域 _GameMain 有 2 个网格渲染器:
    网格渲染器名称:水面
        水面先生有1个材质
            水(实例):
                属性:
                    泡沫纹理
                    _普通 nRHPu
                    _FoamHighTex 高分辨率泡沫
                    普通精细法线贴图2
                    _随机泡沫纹理 随机泡沫
    网格渲染器名称:sub_water_opak_thingyu
        mr sub_water_opak_thingyu 有 1 个材料
            水底平面(实例):
                属性:

这里的前缀是 zone,所以请使用,例如:

游戏主区域泡沫纹理.png(注意双下划线!)


地形

进入区域后,你会立刻看到:

地形 _GameMain,预制体 _Zone(UnityEngine.GameObject)
                属性:
                    草地主纹理
                    噪声纹理 噪声
                    _已清除遮罩纹理
                    _悬崖普通 大块水粉岩石_n
                    种植普通 已种植_n
                    漫反射贴图0 漫反射0
                    _污垢法线 dirt_normal_generated
                    森林_普通 forest_n
                    _GrassNormal grass_normal_generated
                    _铺设普通铺设_n
                    _岩石普通 水粉岩石_n
                    雪地普通 雪地普通

这里的前缀是terrain,所以使用,例如:

地形__游戏主_漫反射纹理0.png

diffuse0 纹理上似乎有十六个不同地形类型的图块。你可以在截图中看到它的使用示例。


环境纹理

环境纹理包括雨、云、雾,还有天上那棵巨大的树状物。

场景转储显示了,例如:

环境YggdrasilBranch有1个MeshRenderers:
    网格渲染器名称:树枝
        布兰奇先生有2种材料
            世界树之枝(实例):
                属性:
                    主纹理 yggbark_d
                    凹凸贴图 yggbark_n
                    _EmissiveTex 世界树_自发光
                    苔藓贴图 世界树苔藓
                    _EmissiveMaskTex yggdrasil_emissivmask
                    折射法线
            世界树分支树叶(实例):
                属性:
                    主纹理 ygg_leaf_d
                    凹凸贴图 ygg_leaf_n
                    自发光贴图
                    苔藓纹理
                    自发光遮罩贴图
                    折射法线


那么,如上所述:

环境渲染器材质_分支_世界树_分支(实例)_主纹理.png

将替换YggdrasilBranch环境对象上分支渲染器的yggdrasil_branch(实例)材质的主纹理。


特殊地点

地点预制体与游戏中的其他模型是分开的,因此必须单独处理。它们包含大量渲染器,所以遍历它们可能非常耗时。因此,你可以在配置中禁用地点替换。另外,地点必须使用地点前缀(texture_ 将不会生效)。


图层

图层允许你在现有纹理或修改后的纹理之上应用局部纹理。对于除精灵以外的所有内容,其工作方式相同:


纹理层

要向精灵图以外的任何内容添加图层,请使用与在上方相应部分替换该类型纹理相同的语法,并在末尾添加 _<你的图层名称>。例如,对于一个名为 RealEyes 的模组的玩家眼睛纹理,应写成:

player_model_0_MainTex_RealEyes.png

<YourLayerName> 可以设置为任意名称,只要它是唯一的且不包含任何下划线。


精灵图层

物品图标图集的精灵图层工作方式不同,它会完全覆盖图集中的一块区域。因此,精灵图层png的大小应仅为你想要替换的那块区域的大小。物品图标图层的文件格式如下:

atlas_item_icons_<startX>_<startY>_<sheetWidth>_<sheetHeight>.png

这是因为你处理的可能是放大后的纹理,所以你需要让模组知道你正在处理的理论图集有多大。模组会将其与现有图集(或被其他纹理替换的图集)进行比较,并据此推算你的图层纹理的缩放比例。因此,举个例子,要替换木盾纹理,我使用一个名为以下名称的64x64像素png:

atlas_item_icons_1224_1840_2048_2048.png

这告诉它,我的 png 来自一张 2048x2048 像素的大图集(与原版图集尺寸相同),并用我的 64x64 像素 png 替换现有图集,以 1224x1840 像素作为左上角起点。


示例

让我们以场景转储中的一个例子来说明:

维京船有1个蒙皮网格渲染器:
    蒙皮网格渲染器名称:sail_full
        不锈钢帆已满,拥有1个材料
            航行(实例):
                属性:
                    主纹理 帆船漫反射
                    凹凸贴图 sail_normal
                    自发光贴图
                    苔藓纹理


你可以根据自己想做的事情来选择使用哪种前缀和标识符:


1. 设置某类对象上的所有纹理

维京船主纹理.png

这会替换对象中每个材质的主纹理,所以如果对象使用了多个纹理,可能效果不会很好。这对我们的示例来说也不太适用,因为飞船上还有一堆MeshRenderer。如果我们想更改凹凸贴图,可以使用:

维京船_凹凸贴图.png


2. 设置纹理的所有实例

texture_sail_diffuse_MainTex.png

这会替换所有名为sail_diffuse的纹理,因此所有使用该纹理的物体都会受到影响。在我们的示例中,它会替换
其他船型如果使用该纹理,也能用这些帆。


3. 为对象类型上的单个网格设置纹理

维京船帆满张主纹理.png

这将替换所有VikingShip对象上名为sail_full的任何渲染器的纹理。


4. 按名称在对象类型上设置纹理

objecttexture_VikingShip_sail_diffuse_MainTex.png

这将替换所有VikingShip对象上名为sail_diffuse的纹理。


4. 设置部分纹理层

以上任何示例都可以通过在末尾添加图层名称,改为以局部图层的方式添加。因此,如果你只想在维京船的帆上添加一个贴花,可以这样做:

维京船帆_酷骷髅与交叉骨_主纹理.png



配置

使用此模组运行一次游戏后,会创建一个配置文件 BepInEx/config/aedenthorn.CustomTextures.cfg)。

你可以通过使用文本编辑器编辑此文件,或在游戏内使用 配置管理器.



场景导出

要获取制作上述名称所需的全部信息,请将配置选项 DumpSceneTextures 设为 true,然后运行游戏并加载一次你的世界。此时应会生成文件 BepInEx/plugins/CustomTextures/scene_dump.txt。转储纹理后你可以将其改回 false,否则每次运行游戏时都会重新创建该文件。


这个模组仍在开发中。



技术

安装此模组最简单的方法是直接使用 旋涡,Nexus Mods 模组管理器。它应该会处理所有依赖项。

要手动安装,请将dll文件放入BepInEx/plugins文件夹。你需要安装BepInEx。

原始代码位于 https://github.com/aedenthorn/ValheimMods.
叉子位于  https://github.com/mrei-kiel/ValheimMods

Valheim: 英灵神殿 的热门 MOD

探索适用于 Valheim: 英灵神殿 的最佳MOD,带来新功能、升级画面,以及令人兴奋的方式来改变您的游戏体验。

使用 Xmod 解锁 Valheim: 英灵神殿 的全部潜力 — 今天就探索这些顶级 MOD!