【翻译】ppsspp替换纹理语法规则

# 简介

在PPSSPP中你可以创建纹理替换包来替换纹理。

你可以在textures.ini文件中自定义纹理路径,如果该路径不存在则使用默认纹理。

## 基本结构

```
[options]
# 目前只有 '1' 这一种版本
version = 1
# 'hash' 的默认值为 'quick'. 其他可选值: xxh32, xxh64 (更好的散列,但速度较慢)
# 当你改变此选项所有的哈希值将会变化。所以从一开始就选定,并坚持使用它。
hash = quick

# 默认使用路径结尾的 '.png'文件。
# 使用自定义文件名称覆盖下面的文件名。
# 使用空白文件名来跳过纹理(如下面的介绍纹理)。
# 语法: hash = filename.png
[hashes]
# 忽略介绍视频纹理。
099bf1c000000909 =
0993698000000909 =
09a47a0000000909 =
09ad024000000909 =
# 水动画。
099c0db096c0500ecd2f3e6e = water/frame1.png
099c2db0d26dc9a7966195cf = water/frame2.png
099c4db0fa2cbcfec0bd3e0f = water/frame3.png
099c6db0d17d9a67c7591d4f = water/frame4.png
# 这个纹理被两个地址加载,内容相同。
094b89907dcca1a5ee284131 = 094b5a707dcca1a5ee284131.png
# 额外的mip level也需要重命名。
094b89907dcca1a5ee284131_1 = 094b5a707dcca1a5ee284131_1.png

# 允许自定义已散列纹理的范围。
# 注意: 有时同一个地址稍后会被重新用于需要更多散列的纹理。
# 语法: address,w,h = w,h
[hashranges]
# 强制把介绍视频散列为480x272。
0x09936980,512,512 = 480,272
0x099bf1c0,512,512 = 480,272
0x09a47a00,512,512 = 480,272
0x09ad0240,512,512 = 480,272
# 把logo修剪为实际纹理大小。
0x090056d0,256,256 = 176,160
0x0900c4d0,256,64 = 208,56
```

## Windows, Android, Linux, Mac和一些其他系统的区别。

如果你准备为其他人制作纹理包——那很棒棒。否则忽略这部分。

文件名是很棘手的一部分。 具体来讲:

* 总是使用 `/` 而不是 `\` 作为目录。 所有平台(甚至 Windows)支持 `/`,但 `\` 只有 Windows 有用。
* 只使用小写文件名. 在 Windows 和 Mac 平台, "Hello.png" 和 "hello.png" 是相同的, 但不是所有系统都这样。 全使用小写是最安全的做法。
* 避免使用特殊字符: Windows 不支持很多特殊符号,并且在其他平台也可能导致问题出现。

如果你遵循这些准则,更多的人将能够感激你的辛勤工作。

## PSP上的纹理尺寸

TL;DR: 有些事机器很难,人却很容易做。 很不幸,这让纹理替换更加困难和烦人。

PSP 的硬件把纹理尺寸限制在 2 的指数,所以游戏一般使用这些尺寸(e.g. 512x512 or 512x256.)

当某个游戏要展示全屏图像 (480x272),不得不使用 512x512 的纹理,因为 PSP 的硬件就是不能处理 480x272 大小的纹理。其余的部分是否利用? 游戏并不在乎——所以经常有垃圾。

不幸的是, 这意味着就算任何人都可以明显看出hashes的不同(像验证码一样)。PPSSPP却很难检测到:有时 512x512 图像是精灵表、字体,或者只是缩小了比例。小图像(甚至32x64)也会出现这种情况。

如果你在不会使PPSSPP变慢的同时解决了这个问题,请发pull request。

解决办法: 你可以在 `[options]` 下添加 `reduceHash = True` ( `hash = quick` 时不能使用。 这只是假设只有上半部分的纹理是重要的。如果一个游戏某一次将一个字母的文本绘制成一个纹理,或者改变下半部分,在这种情况下,这肯定会破坏绘图。如果你碰到这个…你唯一的选择将是从头开始(去掉“reducehash”),或者用破图将就。别说我没告诉你。

##hash部分

hash只是使用PPSSPP内部使用的相同散列来分辨纹理。除了图像数据的散列之外,它还使用调色板的散列(用于调色板交换的图像)和内存中的图像的地址。

请记住,`quick` hash 特别不完美。如果你只依赖它,你可能会发现自己意外地替换了一个完全不相关的纹理。小心决定你的风险。

可以忽略其中一些部分,但如果忽略了,请不要使用 “hash=quick”。 Here are the options (includes mipmap levels, 见下):

```
[hashes]
# 地址 + CLUT (调色板) + 数据 + mipmap level 0.
094b89907dcca1a5ee284131_0 = very/organized/things/texture1.png

# Level 默认为 0.
094b89907dcca1a5ee284131 = very/organized/things/texture2.png

# 忽略使用这个CLUT的纹理 无论数据如何.
094b89907dcca1a500000000_0 =

# 相同CLUT/数据+任何地址:
000000007dcca1a5ee284131 = very/organized/things/texture3.png

# 相同地址/数据+任何CLUT:
094b899000000000ee284131 = very/organized/things/texture4.png

# 相同数据+任何地址 (可能会发生冲突):
0000000000000000ee284131 = very/organized/things/texture3.png
```

## Mipmaps

Mipmapping是一种使远出的纹理看起来更好的游戏技术。

假设你有一张HD (1920x1080)的汽车图像,但这辆车很远。它太远了在你的屏幕上只有19x11 像素 (1%。)

因为GPU的工作机制, 它们会从 1920x1080 的图像中随机挑选几个像素在屏幕中绘制。你可能得到几个尾灯上的像素点,这辆车走远时会变成一个红色的模糊形状(即使这辆车是黑色的)。

Mipmapping修复了这个问题通过给GPU更小的图像当图像在远处。但并不是所有的PSP游戏都使用这些。

原始图像大小是 "mip level 0", 之后每次都宽高精确地变为一半。例如, 如果 "mip level 0" 是 1920x1080, "mip level 1" 就是 960x540。
```
094b89907dcca1a500000000_0 = mip_level_0.png
094b89907dcca1a500000000_1 = mip_level_1.png
094b89907dcca1a500000000_2 = mip_level_2.png
# etc.
```

不需要很大的mip levels,有一些就通常够用。尤其是当玩家启用各向异性纹理时。

mipmapping会让游戏加载速度慢一点,但通常看起来更好。有时它也能使绘图(在初始加载后)更快。

## 更多信息

见 #8715, #8792, #4630, and #9668.

上一篇:2021-05-10


下一篇:浅谈下MIP的优与劣看完再决定到底要不要做MIP网站!