圖片格式是圖片文件的存儲格式。 用于圖片文件的存儲和傳輸。 通常用于磁盤文件、內存和網絡傳輸。
紋理格式是顯卡可以直接采樣的紋理數據的格式。 它是將紋理加載到顯卡時使用的數據格式。
圖像格式和紋理格式之間的關系是無關緊要的。 計算機中的所有圖像文件,如果需要用作紋理,必須先轉換為顯卡識別的紋理格式,然后才能提交給顯卡。
有許多常用的圖像格式,包括位圖和矢量、壓縮和未壓縮、無損和有損壓縮。 例如,bmp是一種未壓縮的位圖格式,png是一種使用lz77壓縮算法對位圖進行無損壓縮的格式。 并且jpg是一種有損壓縮格式,并且jpg沒有alpha通道。
紋理格式取決于顯卡和圖形API的支持。 更基礎的32位紋理,或者不帶Alpha通道,或者16位紋理等,目前顯卡級圖形API都廣泛支持。 一些特殊的紋理格式只能由支持特定圖形API的圖形設備支持。 例如,iOS中獨特的DXTx系列、廣泛使用的ETC系列以及iOS中最新的ASTC系列紋理格式只能在特定設備上支持。
當將圖像加載到紋理中時,需要根據相應的規范對圖像格式進行解碼,通常是解碼成原始位圖圖型和圖形的區別,然后重新編碼成你需要的紋理格式。 游戲引擎,例如Unity或,通常會為我們完成這個過程,而開發者不必自己關注細節。
然而,這種加載方法有一個問題。 解壓縮、解碼、重新編碼、壓縮等都是消耗CPU的操作,這意味著會比較耗時。 因此,它會導致一張圖像從磁盤加載,直到提交到顯存成為紋理。 過程比較慢,加載過程中會出現明顯的卡頓和掉幀現象。
為了加快這個時間,Unity在打包資源時,無論是安裝包圖型和圖形的區別,都采用了一種機制,將圖像預先轉換為對應平臺的紋理格式。 由于包中保存的已經是最終的紋理格式,因此加載時省略了圖像解碼、解壓、紋理編碼的過程,可以加快加載速度。 這就是Unity的包不跨平臺的原因之一,因為紋理格式是與平臺相關的。
這就是為什么 jpg 文件很小,但生成的紋理卻更大的原因。 JPG 是一種有損壓縮圖像文件格式。 一般來說,有損壓縮可以獲得比無損壓縮更小的文件大小,并且JPG沒有Alpha通道。 這個jpg文件對應的紋理格式可能是原始的位圖格式,當然會比jpg大很多。
仔細選擇紋理格式非常重要。 針對不同的目標平臺和不同的顯示要求,選擇您使用的紋理格式和紋理大小對于圖形優化非常重要。
如果目標平臺是PC,并且不需要極高清晰度的圖像質量,那么DXTx當然是你的最佳選擇,并且可以使用壓縮來進一步減小紋理尺寸。 通常選擇不帶透明通道的DXT1,帶透明通道的DXT1。 DXT5。 DXT 紋理格式也是一種有損壓縮編碼紋理。 它的原理和JPG類似,但是采樣速度的大小固定為4x4,所以不能像JPG那樣選擇質量。 其紋理大小比原始32位RGBA紋理表小8倍。 (DXT1) 和 4x (DXT5)。
如果目標平臺是移動設備,目前該設備上主要使用ETC格式,只有少數設備支持DXT格式。 高端 iOS 設備支持新格式 ASTC。 您可以查看文檔以了解有關如何使用它的詳細信息。
如果必須使用JPG圖片來加載,則只能將JPG圖片文件不作為文件使用,而是作為二進制資源使用。 它在運行時被實時加載到內存中,然后轉換成紋理。 這節省了空間,但增加了時間開銷。