mirror of
https://gitlab.com/skmp/dca3-game.git
synced 2025-04-28 13:07:59 +03:00
495 lines
18 KiB
Text
495 lines
18 KiB
Text
pvrtex converts images to Dreamcast PowerVR textures.
|
|
|
|
It is designed to work similarly to tvspelsfreak's texconv, so it can
|
|
be used in place of texconv will minimal changes. It might be helpful
|
|
to read the readme for texconv for additional information not covered
|
|
here. In particular, there are explainations of the types of textures
|
|
supported by the Dreamcast.
|
|
|
|
Compared to texconv, pvrtex has the following enhancements:
|
|
|
|
* Faster texture compression and palette generation
|
|
* Can generate small codebook VQ textures
|
|
* No Qt dependency
|
|
* Support for compressed stride textures
|
|
* Better mipmap generation
|
|
* Dithering
|
|
* Support for additional output file types (adds .PVR and .DT)
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
Usage Examples:
|
|
|
|
pvrtex -i source.png -o texture.dt
|
|
Converts a PNG file to a DT file that is twiddled, uncompressed
|
|
texture, without mipmaps. The format is automatically chosen
|
|
depending on alpha content of source.png (See description for
|
|
AUTO texture format in command option listing).
|
|
|
|
pvrtex -i source.png -o texture.dt -f argb4444 -d -c 64 -m quality -r -R
|
|
Converts a PNG file to a DT file that is twiddled, compressed
|
|
texture, with mipmaps. The texture will use the ARGB4444 color
|
|
format, and dithered. If the source image is not already a
|
|
square power-of-two, it will be resized to be the nearest square
|
|
power-of-two. The codebook used by the compression will be limited
|
|
to 64 entries out of the potential 256; this reduces quality, but
|
|
reduces the size of the texture by 1.5 KB, and improves fillrate.
|
|
|
|
pvrtex -i source.png -o texture.dt -f normal -m
|
|
Converts a PNG file containing a normal map to a DT file,
|
|
with mipmaps.
|
|
|
|
pvrtex -i source.png -o texture.dt -s
|
|
Converts a PNG file to a nontwiddled texture. source.png is not
|
|
required to be a power-of-two width, and can also be any multiple
|
|
of 32 that is <= 1024.
|
|
|
|
pvrtex -i source.png -o texture.dt -f pal8bpp -C 64 -d -p preview.png
|
|
Converts a PNG file to a DT file with 8-bit color. The resulting
|
|
image will not use more than 64 colors out of the potential 256,
|
|
and will be dithered. The pallete for the texture will be written
|
|
to texture.dt.pal. A preview of the resulting texture will be
|
|
written to preview.png.
|
|
|
|
pvrtex -i mip256.png -i mip128.png -i mip64.png -i mip32.png -i mip16.png
|
|
-o texture.dt -m
|
|
Generates a mipmapped texture, using the different input images
|
|
as user defined mipmap levels instead of automatically generating
|
|
all of them. If a mipmap level is not defined by the user, it
|
|
will be generated from a higher level. By default, the higher
|
|
level will not be the level above, but three levels above; if you
|
|
want to use the level above, use fast mipmaps (-m fast) instead.
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
Building:
|
|
|
|
Run "make".
|
|
|
|
:-|
|
|
|
|
To generate the proper README with linebreaks, from
|
|
readme_unformatted.txt, run "make README" or "make all". Requires
|
|
"fmt".
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
Command Line Options:
|
|
|
|
--help, -h
|
|
Displays help
|
|
|
|
--version, -V
|
|
Displays version
|
|
|
|
--in [filename], -i [filename]
|
|
Input image file. This option is required.
|
|
|
|
If multiple input images are specified, they are currently
|
|
assumed to be different mipmap levels for a single texture. Resize
|
|
options can not be used for custom mipmaps, so all images must
|
|
be a square power-of-two.
|
|
|
|
Uses stb_image library for reading the image. The supported
|
|
formats are:
|
|
JPEG, PNG, TGA, BMP, PSD, GIF, HDR, PIC, PMN
|
|
|
|
--out [filename], -o [filename]
|
|
Sets the file name of the converted texture. The extension of
|
|
this filename controls the file format.
|
|
|
|
The supported formats are:
|
|
|
|
.PVR
|
|
Official PowerVR texture. This is incomplete as was
|
|
created to help test the output of the converter, by
|
|
using PC PVR viewing programs to check the resulting
|
|
texture. There are likely incompatiblities with .PVR
|
|
handling of official games (for example, pvrtex does
|
|
not add a GBIX chunk).
|
|
.TEX
|
|
Format used by tvspelsfreak's texconv. pvrtex will
|
|
generate certain formats not supported by texconv but
|
|
representable in the file format (like compressed stride
|
|
textures).
|
|
.DT
|
|
New file format used by this program. Supports small
|
|
codebook VQ, and texture data is aligned to a 32-byte
|
|
boundry to make DMA easier.
|
|
|
|
It's possible to specify no output file if only a preview image
|
|
is desired.
|
|
|
|
--format [type], -f [type]
|
|
Sets the pixel format of the resulting texture.
|
|
|
|
[type] can be one of the following:
|
|
|
|
RGB565
|
|
Best color out of standard formats without sacrificing
|
|
speed, but can have rainbowing on grayscale images.
|
|
ARGB1555
|
|
Allows for fully transparent texels. Better choice for
|
|
grayscale than RGB565, which can have rainbowing.
|
|
ARGB4444
|
|
Allows for alpha gradients, but poorest color depth with
|
|
noticable banding.
|
|
YUV422 / YUV
|
|
Better than RGB565 or ARGB1555 for gradients, but
|
|
bi/trilinear filtering has worse performance.
|
|
PAL8BPP
|
|
Maximum of 256 colors. Palette is generated as a seperate
|
|
file. Must be twiddled. If compression, mipmapping,
|
|
and bi/trilinear are used, a hardware bug causes some
|
|
texels to be filtered incorrectly on the top left/bottom
|
|
right corners of a 4x2 block.
|
|
PAL4BPP
|
|
Maximum of 16 colors. Palette is generated as a seperate
|
|
file. Must be twiddled. If compression, mipmapping,
|
|
and bi/trilinear are used, a hardware bug causes some
|
|
texels to be filtered incorrectly on the top left/bottom
|
|
right corners of a 4x4 block
|
|
BUMPMAP
|
|
Generates PVR normal map. Source image is treated as a
|
|
height map.
|
|
NORMAL
|
|
Generates PVR normal map. Source image is treated as a
|
|
DOT3 normal map, with RGB channels corresponding to the
|
|
normal's XYZ.
|
|
AUTO
|
|
Selects RGB565, ARGB1555, or ARGB4444 depending on alpha
|
|
content of input image. If fully opaque, RGB565 is used,
|
|
all pixels have either fully opaque or fully transparent
|
|
alpha, ARGB1555 is used, and if some pixels have non-fully
|
|
opaque or transparent pixels, ARGB4444 is used.
|
|
AUTOYUV
|
|
Same as AUTO, but usage of RGB565 is replaced with YUV422.
|
|
|
|
--preview [filename], -p [filename]
|
|
Generates a preview of the resulting texture file. You can
|
|
see the results of bit depth reduction, dithering, mipmaps,
|
|
and compression.
|
|
|
|
The preview is can be a PNG, JPG, BMP, or TGA file. Preview
|
|
JPGs are generally not a good choice do to the lack of alpha,
|
|
and possiblility of compression artifacts.
|
|
|
|
--compress [codebook_size / "small"], -c [codebook_size / "small"]
|
|
Generates a VQ compressed texture.
|
|
|
|
codebook_size is an optional parameter adjusts the size of the
|
|
codebook generated for the texture. Reducing the codebook_size
|
|
can improve fillrate, and, with .PVR and .DT files, improve the
|
|
compression ratio of small textures. By default, a full codebook
|
|
is used to generate the best quality texture. codebook_size can
|
|
be a number from 1 to 256, or the string "small".
|
|
|
|
For .PVR files, using a number will never reduce the size of
|
|
the texture, but can improve fillrate. Specifying "small" as the
|
|
codebook size will reduce the texture size for certain textures
|
|
smaller than 64x64 without mipmaps, or 32x32 with mipmaps.
|
|
|
|
For .TEX files, codebook_size will never reduce the size of the
|
|
texture, but can still improve performance.
|
|
|
|
For .DT files, reducing the codebook_size will reduce the size
|
|
of the texture. Specifying "small" as the codebook size will
|
|
select a smaller codebook automatically for textures that are
|
|
128x128 or smaller, with a size of 192 for a 128x128 mipmapped
|
|
texture, down to 10 for an 8x8 non-mipped texture.
|
|
|
|
--max-color [colors], -C [colors]
|
|
This limits the number of colors used for a PAL8BPP or PAL4BPP
|
|
format texture. This option could be used to generate an 8BPP
|
|
texture that only uses 64 colors, and the unused colors could
|
|
be used for other textures.
|
|
|
|
--mipmap ["fast"], -m ["fast"]
|
|
With this option, the resulting file will have mipmaps.
|
|
|
|
By default, a Mitchell-Netravalli filter will be used on a level
|
|
3 steps above. (e.g. 64x64 will be generated from 512x512)
|
|
|
|
Adding the parameter "fast" to this option, each mipmap level
|
|
is generated by downsampling the level above. (e.g. 64x64 level
|
|
will be generated from 128x128) This speeds up mipmap generation
|
|
for large textures.
|
|
|
|
When generating high quality mipmaps for a resized image,
|
|
the largest mips will be generated directly from the source
|
|
image. (i.e. with a 1600x500 source image, converted with "-m
|
|
-r near -R x2", pvrtex will create a 1024x1024 texture, with
|
|
mipmap levels 512x512 and 256x256 generated directly from the
|
|
1600x500 source, and not the 1024x1024 top most level).
|
|
|
|
--no-mip-shift, -S
|
|
When generating mipmaps, by default, pvrtex will preform a
|
|
subpixel adjustment during downsampling to ensure the mipmaps
|
|
line up correctly. This option will disable this.
|
|
|
|
--perfect-mip [levels], -M [levels]
|
|
When using mipmaps and compression, small mipmap levels will be
|
|
loselessly compressed.
|
|
|
|
The levels parameter controls how many levels are lossless. 1
|
|
means only the 1x1 level will be losslessly compressed, 2 means
|
|
1x1 and 2x2 will be loselessly compressed, and so on.
|
|
|
|
Generating lossless mipmaps use up VQ codebook slots. These are
|
|
the total number of codebook entries used for a given number of
|
|
lossless mipmaps:
|
|
|
|
16-bit 8-bit 4-bit
|
|
1 level (1x1) 1 1 1
|
|
2 levels (2x2) 2 1 1
|
|
3 levels (4x4) 6 3 2
|
|
4 levels (8x8) 22 11 6
|
|
5 levels (16x16) 86 43 22
|
|
6 levels (32x32) -- 171 86
|
|
|
|
--high-weight [levels], -H [levels]
|
|
When using mipmaps and compression, this increases the weight
|
|
the compressor gives smaller mipmap levels, to encourage the
|
|
compressor to generate them at higher quality, at the cost of
|
|
lower quality higher levels. Not currently supported for 4BPP
|
|
textures.
|
|
|
|
The levels parameter controls how many levels below the largest
|
|
have extra weight. A value of 1 means every level besides the
|
|
top has boosted weight, a value of 2 means the two largest levels
|
|
have normal weight, while every smaller level is boosted.
|
|
|
|
--dither [amount], -d [amount]
|
|
Enables dithering. Currently, Floyd-Steinberg is used.
|
|
|
|
Amount is an optional parameter that adjusts the amount of
|
|
dithering, and is a decimal value from 0 to 1. 0 will result in
|
|
no dithering, while 1 results in full dithering. If dithering
|
|
is enabled but an amount is not specified, full dithering is used.
|
|
|
|
This option has no effect on YUV textures, but is valid on
|
|
all others.
|
|
|
|
--stride, -s
|
|
Output a non-twiddled texture. This also allows for
|
|
non-power-of-two sized textures. Width must still 8, 16, or
|
|
a multiple of 32 less than or equal to 1024. Any height can be
|
|
used, from 1 to 1024.
|
|
|
|
If a texture has a power-of-two dimensions and --stride is
|
|
used, the resulting texture will be a nontwiddled texture that
|
|
can be rendered without stride, for formats that support such
|
|
textures. (.DT and .TEX support this, .PVR does not.)
|
|
|
|
Stride textures do not wrap as normal if the width is not
|
|
a power-of-two, and have worse rendering performance than
|
|
twiddled textures (especially when filtered or rotated). It
|
|
is not possible to generate palettized or normal textures with
|
|
stride. .PVR files cannnot use stride.
|
|
|
|
Valid widths for stride texture:
|
|
8, 16, 32, 64, 96, 128, 160, 192, 224, 256, 320, 352,
|
|
384, 416, 480, 512, 544, 576, 608, 640, 672, 704, 736,
|
|
768, 800, 832, 864, 896, 928, 960, 992, 1024
|
|
|
|
--resize [method], -r [method]
|
|
Resize a input image that is not a supported PVR texture size
|
|
to a valid size.
|
|
|
|
If the texture is not strided, the texture will be resized to
|
|
a power-of-two on both dimensions. For stride textures, width
|
|
will be adjusted to an appropriate stride size, and the height
|
|
will always be resized to a power-of-two.
|
|
|
|
Method controls how the image will be resized.
|
|
|
|
NONE
|
|
Generates an error if input image is not a valid
|
|
size. This is the default.
|
|
NEAR
|
|
Round size up or down to nearest valid size. If resize is
|
|
enabled, but no method is specified, this is the default.
|
|
UP
|
|
Round size up to next valid size
|
|
DOWN
|
|
Round size down to next valid size
|
|
|
|
Examples for non-stride textures:
|
|
Source size NONE NEAR UP DOWN
|
|
256x256 256x256 256x256 256x256 256x256
|
|
260x260 Error 256x256 512x512 256x256
|
|
200x200 Error 256x256 256x256 128x128
|
|
200x260 Error 256x256 256x512 128x256
|
|
2000x2000 Error 1024x1024 1024x1024 1024x1024
|
|
1x1 Error 8x8 8x8 8x8
|
|
|
|
--mip-resize [method], -R [method]
|
|
When using mipmaps, resizes nonsquare images to be square. This
|
|
option does nothing if not using mipmaps or the image is already
|
|
square (after --resize). This new size calculation occurs after
|
|
the standard --resize. Source images are only resized once. This
|
|
option will not resize the image to a power-of-two size if it's
|
|
not already (use --resize for that).
|
|
|
|
Method controls how the image will be resized.
|
|
|
|
NONE
|
|
Generates an error if input image is not a valid mipmap
|
|
size. This is the default.
|
|
X2
|
|
Doubles the narrower dimension. A 256x32 image will
|
|
be resized to 64x64. If mip-resize is enabled, but no
|
|
method is specified, this is the default.
|
|
X4
|
|
Quaduples or doubles the narrower dimension. A 256x32
|
|
image will be resized to 128x128.
|
|
UP
|
|
Resizes the narrower dimension to be the same size as
|
|
the wider. A 256x32 image will be resized to 256x256.
|
|
DOWN
|
|
Resizes the wider dimension to be the same size as the
|
|
narrower. A 256x32 image will be resized to 32x32.
|
|
|
|
Examples:
|
|
|
|
Source size X2 X4 UP DOWN
|
|
256x256 256x256 256x256 256x256 256x256
|
|
256x128 256x256 256x256 256x256 128x128
|
|
256x64 128x128 256x256 256x256 64x64
|
|
256x32 64x64 128x128 256x256 32x32
|
|
1024x8 16x16 32x32 1024x1024 8x8
|
|
|
|
--edge [type], -e [type]
|
|
Controls how the edges of the image are handled when
|
|
resizing. This also affects height map to normal map conversion.
|
|
|
|
Valid options:
|
|
|
|
CLAMP
|
|
Samples are clamped to edge of image, default if not
|
|
mipmapped.
|
|
WRAP
|
|
Samples wrap around to other side of image, default if
|
|
mipmaps are used. Is works well when the texture is used
|
|
to that it repeats, but might cause noticble bleeding
|
|
around the edge of the texture in certain situations. For
|
|
example, a poster or sign that doesn't repeat across
|
|
the polygon. In that cause, CLAMP should be used.
|
|
REFLECT
|
|
Samples reflect off edge of image back into valid area. If
|
|
you use are planning on using UV mirroring instead of
|
|
wrapping, use this instead of wrap.
|
|
ZERO
|
|
Outside of image is treated as transparent blackness. This
|
|
is not currently supported for images with a --type
|
|
of BUMPMAP.
|
|
|
|
The default is CLAMP if not using mipmaps, or WRAP if mipmaps
|
|
are used.
|
|
|
|
--bilinear, -b
|
|
In texconv, this was used to generate mipmaps with a box
|
|
filter. This option is ignored in pvrtex, which currently always
|
|
uses a Mitchell-Netravalli filter.
|
|
|
|
--nearest, -n
|
|
In texconv, this was used to generate mipmaps by point
|
|
sampling. This option is not supported in pvrtex, and will cause
|
|
pvrtex to abort.
|
|
|
|
--vqcodeusage (Not supported)
|
|
This option from texconv is not recognized at all by pvrtex.
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
.DT File Format
|
|
|
|
See file_dctex.h for documentation. file_dctex.h can also be used
|
|
as a library to help access information from the file's header.
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
Known bugs
|
|
|
|
High weight compressed mips (--high-weight) does not currently
|
|
work with 4BPP textures; the parameter will be ignored if
|
|
specified.
|
|
|
|
There is a weird pathological performance issue with compression
|
|
on certain textures. With a 1024x1024 texture with mips that
|
|
is ff000000 on the left side, and ffffffff on the right side,
|
|
performance drops by around 15x. It is apparently cache missing
|
|
constantly, according to cachegrind, in a function that reads
|
|
memory linearly (distance_limited in elbg.c). Doesn't make sense.
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
Future Ideas
|
|
|
|
* Code clean up
|
|
|
|
* Add Yliluoma dithering
|
|
|
|
* Improve error checking
|
|
|
|
* It might be possible to improve VQ quality by compressing
|
|
4/5/6 bit color instead of 8 bit (so the compressor won't waste
|
|
codebook space on colors that are too similar to distinguish at
|
|
given bit depth)
|
|
|
|
* Speed up compression by not processing alpha for opaque textures
|
|
|
|
* Add ability to generate a single palette to be shared for
|
|
multiple textures
|
|
|
|
* Allow specifying palette format
|
|
|
|
* Allow specifiying custom external palette for texture
|
|
|
|
* Add ability to generate animated VQ textures with shared
|
|
codebook for all frames
|
|
|
|
* Auto generate output name (e.g. -i image.png -o $.dt will
|
|
output image.dt)
|
|
|
|
* Add wildcard input files (e.g. -i *.png)
|
|
|
|
* Add VQ index dithering
|
|
|
|
* Add KIMG output support
|
|
|
|
* Allow texture formats (PVR/TEX/DT/KMG) to be used as input
|
|
formats, to transcode or recompress textures
|
|
|
|
* Add per-axis edge sampling control
|
|
|
|
* Rework code so that this can be used as a library
|
|
|
|
* Allow sizing to arbitary size (i.e. --resize 256x256)
|
|
|
|
* Add a filter to try to hide the palettized compressed mipmap bug
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
History:
|
|
|
|
Version 1.01
|
|
Program now displays error message when an error occurs
|
|
loading a source image. Previously, the program would
|
|
hit an assertion.
|
|
|
|
Fixed "--resize down" option. Previously, the program
|
|
would round down sizes that were already a power-of-two,
|
|
now sizes that are already POT are left unchanged.
|
|
|
|
Included a missing FFmpeg header file.
|
|
|
|
Version 1.0
|
|
Initial release
|
|
|
|
--------------------------------------------------------------------------
|
|
|
|
License:
|
|
This uses code from FFmpeg, which is LGPL, so this project is
|
|
also LGPL. Files not originating from FFmpeg can also be used
|
|
as public domain code/BSD/MIT/whatever.
|