这是什么材质compression/encoding? 运行-长度编码?有没有办法上传到 Open Gl?
What kind of texture compression/encoding is this? Run-Length encoding? Is there a way for Uploading to Open Gl?
我有一些旧电脑游戏的纹理。它们以简单的 运行 长度编码存储在一个巨大的文件中。我知道图像的宽度和高度,图像也有一些完全透明的部分。
一个纹理结构如下:
-一张颜色图:有256种颜色,每种颜色包含4个字节。 b、g、r 的一个值和一个零值
-texel Data: 一般每个字节对应颜色图中的一种颜色但是
透明纹素数据使用 运行 长度编码进行压缩:
- 第一个值表示第一行以多少个透明纹素开始
- 以下值表示有多少后续字节对应于颜色图中的纹素
(字节 5 意味着您必须将接下来的 5 个字节映射到颜色图)
5 个字节之后的值可以是另一个透明像素计数指示器,其后是另一个彩色像素计数。
- 但如果值为 0xFE,则此行中没有其他颜色的纹素。如果此行中的纹素少于图像宽度给定的纹素,则其余纹素是透明的。
- 如果值为 0xFF,则到达 image/the 最后一行的末尾。如果图像高度给出的行数较少,则其余纹素是透明的。
例如 4x4 纹理可能如下所示:
02 01 99 FE(两个透明像素,颜色99,一个透明像素填满宽度)
01 02 98 99 FE(一个透明像素,颜色98,颜色99,一个透明像素填满宽度)
00 01 99 01 02 98 99 FE(颜色99,一个透明像素,颜色98,颜色99)
02 02 99 98 FF(两个透明像素点,颜色99,颜色98)
所以我认为因为这是一个非常基本的压缩,也许有人知道它是否被称为特定名称或什么?
最重要的是,有没有办法将这个“压缩”数据上传到 openGL?我知道我必须为 openGl 中的数据指定一些编码。
我已经编写了一个算法来将此数据转换为正常的 rgba 数据。但这比游戏实际指定的图形内存要多得多(每个图像大约 30% 是透明的,可以 运行-length 编码)。因此,如果游戏没有将图像转换为所有 rgba,我也想找到一种方法。
有人可以帮我吗?
这只是一张对空白区域使用 RLE 编码的调色板图像。没有真正的名字。有点像GIF,只是没那么好,但可能更容易解压。
I ve already writen an algorythm to convert this data to normal rgba data.
那么你就完成了。将其上传到 OpenGL 纹理。
So if the game is not converting the image to all rgba i want also find a way for that.
你不能。
虽然您可以通过使用两个纹理或一个纹理和调色板的 UBO/SSBO 在着色器中实现调色板,但您不能在着色器中实现 run-length 编码方案。
RLE 适合数据存储和批量解压,但在随机访问时糟糕。随机访问正是纹理的工作方式。没有真正的方法可以将纹理坐标映射到包含相应纹素数据的内存地址。如果你不能这样做,你就不能访问纹素。
实际压缩纹理格式的设计方式是您可以直接从纹理坐标转到包含该纹素的数据块的确切内存地址。 RLE 不是那样的。
我有一些旧电脑游戏的纹理。它们以简单的 运行 长度编码存储在一个巨大的文件中。我知道图像的宽度和高度,图像也有一些完全透明的部分。
一个纹理结构如下:
-一张颜色图:有256种颜色,每种颜色包含4个字节。 b、g、r 的一个值和一个零值
-texel Data: 一般每个字节对应颜色图中的一种颜色但是 透明纹素数据使用 运行 长度编码进行压缩:
- 第一个值表示第一行以多少个透明纹素开始
- 以下值表示有多少后续字节对应于颜色图中的纹素 (字节 5 意味着您必须将接下来的 5 个字节映射到颜色图) 5 个字节之后的值可以是另一个透明像素计数指示器,其后是另一个彩色像素计数。
- 但如果值为 0xFE,则此行中没有其他颜色的纹素。如果此行中的纹素少于图像宽度给定的纹素,则其余纹素是透明的。
- 如果值为 0xFF,则到达 image/the 最后一行的末尾。如果图像高度给出的行数较少,则其余纹素是透明的。
例如 4x4 纹理可能如下所示:
02 01 99 FE(两个透明像素,颜色99,一个透明像素填满宽度)
01 02 98 99 FE(一个透明像素,颜色98,颜色99,一个透明像素填满宽度)
00 01 99 01 02 98 99 FE(颜色99,一个透明像素,颜色98,颜色99)
02 02 99 98 FF(两个透明像素点,颜色99,颜色98)
所以我认为因为这是一个非常基本的压缩,也许有人知道它是否被称为特定名称或什么? 最重要的是,有没有办法将这个“压缩”数据上传到 openGL?我知道我必须为 openGl 中的数据指定一些编码。
我已经编写了一个算法来将此数据转换为正常的 rgba 数据。但这比游戏实际指定的图形内存要多得多(每个图像大约 30% 是透明的,可以 运行-length 编码)。因此,如果游戏没有将图像转换为所有 rgba,我也想找到一种方法。
有人可以帮我吗?
这只是一张对空白区域使用 RLE 编码的调色板图像。没有真正的名字。有点像GIF,只是没那么好,但可能更容易解压。
I ve already writen an algorythm to convert this data to normal rgba data.
那么你就完成了。将其上传到 OpenGL 纹理。
So if the game is not converting the image to all rgba i want also find a way for that.
你不能。
虽然您可以通过使用两个纹理或一个纹理和调色板的 UBO/SSBO 在着色器中实现调色板,但您不能在着色器中实现 run-length 编码方案。
RLE 适合数据存储和批量解压,但在随机访问时糟糕。随机访问正是纹理的工作方式。没有真正的方法可以将纹理坐标映射到包含相应纹素数据的内存地址。如果你不能这样做,你就不能访问纹素。
实际压缩纹理格式的设计方式是您可以直接从纹理坐标转到包含该纹素的数据块的确切内存地址。 RLE 不是那样的。