123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- .. _doc_importing_textures:
- Importing textures
- ==================
- Do NOT import them in most cases
- --------------------------------
- In most cases you **don't** want images imported when dealing with 2D
- and GUI. Just copy them to the filesystem. Read the tutorial on
- :ref:`doc_managing_image_files` before continuing! For 3D,
- textures are always imported by the 3D scene importer, so importing
- those is only useful when importing a texture used for 3D that doesn't
- come with the 3D scene (for example, in a shader). The flags and options
- are the same as here, so reading the rest of the document might help
- too.
- OK, you *might* want to import them
- -----------------------------------
- So, if you have read the previous tutorial on the texture exporter, the
- texture importer gives you more fine-grained control on how textures
- are imported. If you want to change flags such as repeat, filter,
- mipmaps, fix edges, etc. ***PER texture***, importing them is the best
- way to accomplish this (since you can't save such flags in a standard
- image file).
- Lack of MipMaps
- ---------------
- Images in 3D hardware are scaled with a (bi)linear filter, but this
- method has limitations. When images are shrunk too much, two problems
- arise:
- - **Aliasing**: Pixels are skipped too much, and the image shows
- discontinuities. This decreases quality.
- - **Cache Misses**: Pixels being read are too far apart, so texture
- cache reads a lot more data than it should. This decreases
- performance.
- .. image:: /img/imagemipmap.png
- To solve this, mipmaps are created. Mipmaps are versions of the image
- shrunk by half in both axis, recursively, until the image is 1 pixel of
- size. When the 3D hardware needs to shrink the image, it finds the
- largest mipmap it can scale from, and scales from there. This improves
- performance and image quality.
- .. image:: /img/mipmaps.png
- Godot automatically creates mipmaps upon load for standard image files.
- This process is time consuming (although not much) and makes load times
- a little worse. Pre-importing the textures allows the automatic
- generation of mipmaps.
- Unwanted MipMaps
- ----------------
- Remember the previous point about mipmaps? Yes, they are cool, but
- mobile GPUs only support them if the textures are in power of 2
- dimensions (i.e. 256x256 or 512x128). In these platforms, Godot will
- stretch and enlarge the texture to the closest power of 2 size and then
- generate the mipmaps. This process takes more of a performance hit and
- it might degrade the quality a little more.
- Because of this, there are some scenarios when it may be desirable to
- not use them, and just use a linear filter. One of them is when working
- with graphical user interfaces (GUIs). Usually they are made of large
- images and don't stretch much. Even if the screen resolution is in a
- larger or smaller value than original art, the amount of stretch is not
- as much and the art can retain the quality. Pre-importing the textures
- also allows the disabling of mipmap generation.
- Blending artifacts
- ------------------
- The `blending
- equation <http://en.wikipedia.org/wiki/Alpha_compositing>`__ used by
- applications like Photoshop is too complex for realtime. There are
- better approximations such as `pre-multiplied
- alpha <http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx?Redirected=true>`__,
- but they impose more stress in the asset pipeline. In the end, we are
- left with textures that have artifacts in the edges, because apps such
- as Photoshop store white pixels in completely transparent areas. Such
- white pixels end up showing thanks to the texture filter.
- Godot has an option to fix the edges of the image (by painting invisible
- pixels the same color as the visible neighbours):
- .. image:: /img/fixedborder.png
- However, this must be done every time the image changes. Pre-Importing
- the textures makes sure that every time the original file changes, this
- artifact is fixed upon automatic re-import.
- Texture flags
- -------------
- Textures have flags. The user can choose for them to repeat or clamp to
- edges (when UVs exceed the 0,0,1,1 boundary). The magnifying filter can
- also be turned off (for a Minecraft-like effect). Such values can not be
- edited in standard file formats (png, jpg, etc.), but can be edited and
- saved in Godot .tex files. Then again, the user may not want to change
- the values every time the texture changes. Pre-Importing the textures
- also takes care of that.
- Texture compression
- -------------------
- Aside from the typical texture compression, which saves space on disk
- (.png, jpg, etc.), there are also texture compression formats that save
- space in memory (more specifically video memory. This allows to have
- much better looking textures in games without running out of memory, and
- decrease memory bandwidth when reading them so they are a big plus.
- There are several video texture compression formats, none of which are
- standard. Apple uses PVRTC. PC GPUs, consoles and nVidia Android devices use
- S3TC (BC), other chipsets use other formats. OpenGL ES 3.0 standardized on ETC
- format, but we are still a few years away from that working everywhere.
- Still, when using this option, Godot converts and compresses to the
- relevant format depending on the target platform (as long as the user
- pre-imported the texture and specified video ram compression!).
- This kind of compression is often not desirable for many types of 2D games
- and UIs because it is lossy, creating visual artifacts. This is especially
- noticeable on games that use the trendy vectory social game artwork.
- However, the fact that it saves space and improves performance may make up for
- it.
- The 3D scene importer always imports textures with this option turned
- on.
- Atlases
- -------
- Remember how mobile GPUs have this limitation of textures having to be
- in power of 2 sizes to be able to generate mimpmaps for optimum
- stretching? What if we have a lot of images in different random sizes?
- All will have to be scaled and mipmapped when loaded (using more CPU and
- memory) or when imported (taking more storage space). This is probably still
- OK, but there is a tool that can help improve this situation.
- Atlases are big textures that fit a lot of small textures inside
- efficiently. Godot supports creating atlases in the importer, and the
- imported files are just small resources that reference a region of the
- bigger texture.
- Atlases can be a nice solution to save some space on GUI or 2D artwork
- by packing everything together. The current importer is not as useful
- for 3D though (3D Atlases are created differently, and not all 3D
- models can use them).
- As a small plus, atlases can decrease the amount of "state changes" when
- drawing. If a lot of objects that are drawn using several different
- textures are converted to an atlas, then the texture rebinds per object
- will go from dozens or hundreds to one. This will give the performance a
- small boost.
- Artists use PSD
- ---------------
- Still wondering whether to use the texture importer or not? Remember
- that in the end, artists will often use Photoshop anyway, so it may be
- wiser to just let the import subsystem to take care of importing and
- converting the PSD files instead of asking the artist to save a png and
- copy it to the project every time.
- Texture importer
- ----------------
- Finally! It's time to take a look at the texture importer. There are 3
- options in the import menu. They are pretty much (almost) the same
- dialog with a different set of defaults.
- .. image:: /img/importtex.png
- When selected, the texture import dialog will appear. This is the
- default one for 2D textures:
- .. image:: /img/import_images.png
- Each import option has a function, explained as follows:
- Source texture(s)
- ~~~~~~~~~~~~~~~~~
- One or more source images can be selected from the same folder (this
- importer can do batch-conversion). This can be from inside or outside
- the project.
- Target path
- ~~~~~~~~~~~
- A destination folder must be provided. It must be inside the project, as
- textures will be converted and saved to it. Extensions will be changed
- to .tex (Godot resource file for textures), but names will be kept.
- Texture format
- ~~~~~~~~~~~~~~
- This combo allows to change the texture format (compression in this
- case):
- .. image:: /img/compressopts.png
- Each of the four options described in this table together with their
- advantages and disadvantages ( |good| = Best, |bad| =Worst ):
- +----------------+------------------------+---------------------------+-------------------------+------------------------------------------------------+
- | | Uncompressed | Compress Lossless (PNG) | Compress Lossy (WebP) | Compress VRAM |
- +================+========================+===========================+=========================+======================================================+
- | Description | Stored as raw pixels | Stored as PNG | Stored as WebP | Stored as S3TC/BC,PVRTC/ETC, depending on platform |
- +----------------+------------------------+---------------------------+-------------------------+------------------------------------------------------+
- | Size on Disk | |bad| Large | |regular| Small | |good| Very Small | |regular| Small |
- +----------------+------------------------+---------------------------+-------------------------+------------------------------------------------------+
- | Memory Usage | |bad| Large | |bad| Large | |bad| Large | |good| Small |
- +----------------+------------------------+---------------------------+-------------------------+------------------------------------------------------+
- | Performance | |regular| Normal | |regular| Normal | |regular| Normal | |good| Fast |
- +----------------+------------------------+---------------------------+-------------------------+------------------------------------------------------+
- | Quality Loss | |good| None | |good| None | |regular| Slight | |bad| Moderate |
- +----------------+------------------------+---------------------------+-------------------------+------------------------------------------------------+
- | Load Time | |regular| Normal | |bad| Slow | |bad| Slow | |good| Fast |
- +----------------+------------------------+---------------------------+-------------------------+------------------------------------------------------+
- Texture options
- ~~~~~~~~~~~~~~~
- Provided are a small amount of options for fine grained import control:
- - **Streaming Format** - This does nothing as of yet, but a texture
- format for streaming different mipmap levels is planned. Big engines
- have support for this.
- - **Fix Border Alpha** - This will fix texture borders to avoid the
- white auras created by white invisible pixels (see the rant above).
- - **Alpha Bit Hint** - Godot auto-detects if the texture needs alpha
- bit support for transparency (instead of full range), which is useful
- for compressed formats such as BC. This forces alpha to be 0 or 1.
- - **Compress Extra** - Some VRAM compressions have alternate formats
- that compress more at the expense of quality (PVRTC2 for example). If
- this is ticked, texture will be smaller but look worse.
- - **No MipMaps** - Force imported texture to NOT use mipmaps. This may
- be desirable in some cases for 2D (as explained in the rant above),
- though it's NEVER desirable for 3D.
- - **Repeat** - Texture will repeat when UV coordinates go beyond 1 and
- below 0. This is often desirable in 3D, but may generate artifacts in
- 2D.
- - **Filter** - Enables linear filtering when a texture texel is larger
- than a screen pixel. This is usually turned on, unless it's required
- for artistic purposes (Minecraft look, for example).
- .. |bad| image:: /img/bad.png
- .. |good| image:: /img/good.png
- .. |regular| image:: /img/regular.png
|