æé«ã®ãã¯ã¹ãã£å§çž®åœ¢åŒã¯äœã§ããïŒ ãã¶ããPNGãETCãPVRTCãS3TCããŸãã¯ä»ã®äœãã§ããããïŒ è³ªåã¯åçŽã§ã¯ãããŸããããéåžžã«éèŠã§ãã ããžã¥ã¢ã«ãã¶ã€ã³ã®å質ãAndroidã¢ããªã±ãŒã·ã§ã³ã®é床ãšãµã€ãºã¯ãçãã«äŸåããŸãã åé¡ã¯ãæ®éçãªãæè¯ã®åœ¢åŒããåã«ååšããªããšããäºå®ã«ãã£ãŠè€éã«ãªããŸãã ããã¯ãã¹ãŠãéçºè
ã®ããŒãºã«äŸåããŸãã

ãã¯ã¹ãã£ã2次å
ãŸãã¯3次å
ã¢ãã«ã«é©çšããæè¡ã¯ãã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã§åºã䜿çšãããŠããŸãã ããã¯ãã¢ãã«ã«ãã£ãŠè¡šããããªããžã§ã¯ãã®è©³çŽ°ãæ¹åããããã«è¡ãããŸãã Androidã¯å€ãã®ãã¯ã¹ãã£å§çž®åœ¢åŒããµããŒãããŠãããããããã«é·æãšçæããããŸãã
ãã¯ã¹ãã£ãšãã®ã¹ãã¬ãŒãžåœ¢åŒã®æäœã«é¢ããäºåæ
å ±
ãã¯ã¹ãã£ãããã³ã°ã¯ãç»åãã·ã§ã€ããŸãã¯ããªãŽã³ã®è¡šé¢ã«ã貌ãä»ãããæ¹æ³ã§ãã ããããããããããã«ãå³ãç®±ãšæ¯èŒãããã®äžã«äœããå
¥ããŠèª°ãã«æž¡ãããã«ããã®ç®±ãå
ãæš¡æ§ä»ãã®å
è£
çŽã§ãã¯ã¹ãã£ãæ¯èŒããŸãã ãããã£ãŠãè±èªã®æç®ã§ã¯ããã¯ã¹ãã£ãããã³ã°ã¯ãã¯ã¹ãã£ã©ããã³ã°ãšãåŒã°ãããã¯ã¹ãã£ã©ããã³ã°ãšããŠç¿»èš³ã§ããŸãã
æåã®ã¿ã³ã¯ã¯ããªãŽã³ã¢ãã«ã§ã2çªç®ã®ã¿ã³ã¯ã¯ãã¯ã¹ãã£ãã¹ãŒããŒã€ã³ããŒãºãããåãã¢ãã«ã§ããMIPã«ãŒãïŒMipmapsïŒã¯ãã¡ã€ã³ãã¯ã¹ãã£çšã«çæãããç»åã®æé©åãããã°ã«ãŒãã§ãã éåžžãç»åã®ã¬ã³ããªã³ã°é床ãäžããç»åãæ»ããã«ããïŒã¢ã³ããšã€ãªã¢ã·ã³ã°ïŒãããã€ãŸããã¹ããããã©ã€ã³ã®å¹æãåãé€ãããã«äœæãããŸãã ãããã®åã¬ãã«ïŒå®éã«ã¯ãmipããšåŒã°ããŸã-ããã¯ã©ã¹ã¿ãŒã€ã¡ãŒãžã®1ã€ã§ãããMIPã«ãŒãã«å«ãŸãããã¯ã¹ãã£ã®ã»ããã§æ§æãããŸãïŒ-ããã¯äœè§£å床ã®å
ã®ãã¯ã¹ãã£ã®ããŒãžã§ã³ã§ãã
ãã®ãããªç»åã¯ããã¯ã¹ãã£ãªããžã§ã¯ããé ãããèŠããå Žåãããµã€ãºãçž®å°ãããŠããå Žåã«äœ¿çšãããŸãã MIPã«ãŒãã䜿çšãããšããã¢ã€ãã¢ã¯ãç§ãã¡ããé ãé¢ããŠãããã寞æ³ãå°ãããªããžã§ã¯ãã®çŽ°éšãåã«åºå¥ã§ããªããšããäºå®ã«åºã¥ããŠããŸãã ãã®èãã«åºã¥ããŠããããã®ããŸããŸãªãã©ã°ã¡ã³ãã䜿çšããŠããªããžã§ã¯ãã®ãµã€ãºã«åºã¥ããŠãã¯ã¹ãã£ã®ããŸããŸãªéšåãè¡šãããšãã§ããŸãã ããã«ãããã¡ã€ã³ãã¯ã¹ãã£ã®å°ããããŒãžã§ã³ã®ãã¯ã»ã«ïŒãã¯ã¹ãã£ãã¯ã»ã«ïŒã倧å¹
ã«å°ãªããªããããã€ãŸãGPUãããå°ãªãããŒã¿ãåŠçããŠãã¯ã¹ãã£ã¢ãã«ãåºåãããããã¬ã³ããªã³ã°é床ãåäžããŸãã ããã«ãMIPã«ãŒãã¯éåžžã¢ã³ããšã€ãªã¢ã¹åŠçããããããé¡èãªã¢ãŒãã£ãã¡ã¯ãã®æ°ã¯å€§å¹
ã«åæžãããŸãã ããã§ã¯ãPNGãETCïŒKTXïŒãETC2ïŒKTXïŒãPVRTCãããã³S3TCã®åœ¢åŒã®MIPã«ãŒãã«ã€ããŠèª¬æããŸãã

MIPã«ãŒãããŒã¿ãã«ãããã¯ãŒã¯ã°ã©ãã£ãã¯ã¹ïŒPNGïŒ
PNGã¯ãæ
å ±ã倱ãããšãªãã°ã©ãã£ãã¯ããŒã¿ãå§çž®ããã¢ã«ãŽãªãºã ã䜿çšããŠãããšããç¹ã§ç¹ã«æ³šç®ã«å€ããã©ã¹ã¿ãŒã€ã¡ãŒãžã¹ãã¬ãŒãžåœ¢åŒã§ãã ã«ã©ãŒã€ã³ããã¯ã¹ä»ãç»åïŒ24ãããRGBãŸãã¯32ãããRGBAïŒããã«ã«ã©ãŒç»åãã°ã¬ãŒã¹ã±ãŒã«ç»åãããã³ã¢ã«ãã¡ãã£ãã«ããµããŒãããŠããŸãã
ã¡ãªãã
- ãã®åœ¢åŒã§ã¯ã°ã©ãã£ãã¯ããŒã¿ã®å¯éå§çž®ã䜿çšããããããPNGç»åã¯éåžžã«é«å質ã§ãã
- 8ããããš16ãããã®äž¡æ¹ã®ééæ§ããµããŒãããŸãã
æ¬ ç¹
- ãã¡ã€ã«ã倧ããã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã®ãµã€ãºãšã¡ã¢ãªæ¶è²»ãå¢å ããŸãã
- ã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ã«å¯Ÿããæ¯èŒçé«ãéèŠïŒããã©ãŒãã³ã¹ã®äœäžã«ã€ãªãããŸãïŒã
ãšãªã¯ãœã³ãã¯ã¹ãã£å§çž®ïŒETCïŒ
ãšãªã¯ãœã³ãã¯ã¹ãã£å§çž®ã¯ã4x4ãã¯ã»ã«ãããã¯ã§åäœãããã¯ã¹ãã£å§çž®åœ¢åŒã§ãã Khronosã¯ããšããšãOpen GL ES 2.0ã®æšæºåœ¢åŒãšããŠETCã䜿çšããŠããŸããã ïŒãã®ããŒãžã§ã³ã¯ETC1ãšãåŒã°ããŸãïŒã ãã®çµæããã®åœ¢åŒã¯ã»ãŒãã¹ãŠã®Androidããã€ã¹ã§äœ¿çšã§ããŸãã OpenGL ES 3.0ã®ãªãªãŒã¹ã æ°ããæšæºãšããŠãETC2圢åŒïŒETC1ã®æ¹èšçïŒã䜿çšãããŸãã 2ã€ã®æšæºã®äž»ãªéãã¯ããã¯ã»ã«ã°ã«ãŒãã§åäœããã¢ã«ãŽãªãºã ã§ãã ã¢ã«ãŽãªãºã ã®æ¹åã«ãããå°ããªç»åã®è©³çŽ°ã®åºåã®ç²ŸåºŠãåäžããŸããã ãã®çµæãç»è³ªã¯æ¹åãããŸãããããã¡ã€ã«ãµã€ãºã¯æ¹åãããŠããŸããã
ETC1ããã³ETC2ã¯24ãããRGBããŒã¿ã®å§çž®ããµããŒãããŠããŸãããã¢ã«ãã¡ãã£ãã«ã䜿çšããç»åã®å§çž®ã¯ãµããŒãããŠããŸããã ããã«ãETCã¢ã«ãŽãªãºã ã«é¢é£ãã2ã€ã®ç°ãªããã¡ã€ã«åœ¢åŒããããŸãããããã¯KTXãšPKMã§ãã
KTXã¯æšæºçãªKhronos Groupãã¡ã€ã«åœ¢åŒã§ãããå€ãã®ç»åãä¿åã§ããã³ã³ãããæäŸããŸãã KTXã䜿çšããŠMIPã«ãŒããäœæãããšãåäžã®KTXãã¡ã€ã«ãçæãããŸãã PKMãã¡ã€ã«ã®åœ¢åŒã¯ã¯ããã«åçŽã§ããã®ãããªãã¡ã€ã«ã¯äž»ã«åã
ã®ç»åãä¿åããããã«äœ¿çšãããŸãã ãã®çµæãMIPã«ãŒãã®äœæäžã«PKMã䜿çšãããšãåäžã®KTXã§ã¯ãªãè€æ°ã®PKMãã¡ã€ã«ãäœæãããŸãã ãããã£ãŠãPKM圢åŒã¯MIPã«ãŒãã®ä¿åã«ã¯æšå¥šãããŸããã
ã¡ãªãã
- ETCãã¡ã€ã«ã®ãµã€ãºã¯ãPNGãã¡ã€ã«ã®ãµã€ãºãããèããå°ãããªã£ãŠããŸãã
- ãã®åœ¢åŒã¯ãã»ãŒãã¹ãŠã®Androidããã€ã¹ã§ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããµããŒãããŠããŸãã
æ¬ ç¹
- å質ã¯PNGã»ã©é«ããããŸããïŒETCã¯æ
å ±ã®æ倱ã䌎ãç»åå§çž®åœ¢åŒã§ãïŒã
- éæ床ã®ãµããŒãã¯ãããŸããã
ETCã§ç»åãå§çž®ããã«ã¯ã
Mali GPUãã¯ã¹ãã£å§çž®ããŒã«ãš
ETC-PackããŒã«ã䜿çšã§ããŸãã
PowerVRãã¯ã¹ãã£å§çž®ïŒPVRTCïŒ
PowerVRãã¯ã¹ãã£å§çž®ã¯ãäž»ã«ã€ããžããŒã·ã§ã³ãã¯ãããžãŒã®PowerVR MBXãSGXãããã³äžæ£ããã€ã¹ã§äœ¿çšãããæ倱ã®å€ãã°ã©ãã£ãã¯ããŒã¿çšã®åºå®ã¬ãã«ã®å§çž®åœ¢åŒã§ãã iPhoneãiPodãiPadã§æšæºã®ç»åå§çž®æ¹æ³ãšããŠäœ¿çšãããŸãã
ETCãS3TCãšã¯ç°ãªããPVRTCã¢ã«ãŽãªãºã ã¯ãã¯ã»ã«ã®åºå®ãããã¯ã§ã¯æ©èœããŸããã ãã€ãªãã¢æ¡å€§ãšã2ã€ã®äœè§£å床ç»åã®äœç²ŸåºŠãã¬ã³ãã䜿çšããŸãã ç¬èªã®å§çž®ããã»ã¹ã«å ããŠãPVRTCã¯ã2-bppãªãã·ã§ã³ïŒãã¯ã»ã«ããã2ãããïŒãš4-bppãªãã·ã§ã³ïŒãã¯ã»ã«ããã4ãããïŒã®äž¡æ¹ã«å¯ŸããŠãRGBA圢åŒïŒéæ床ããïŒããµããŒãããŠããŸãã
ã¡ãªãã
- ã¢ã«ãã¡ãã£ãã«ã®ãµããŒãã
- RGBAã¯ããªãã·ã§ã³2-bppïŒãã¯ã»ã«ããã2ãããïŒããã³ãªãã·ã§ã³4-bppïŒãã¯ã»ã«ããã4ãããïŒããµããŒãããŸãã
- ãã¡ã€ã«ãµã€ãºã¯PNGãããã¯ããã«å°ããã§ãã
- GPU PoverVRã§ã®ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®ãµããŒãã
æ¬ ç¹
- å質ã¯ãPNGã䜿çšããå Žåã»ã©é«ããããŸããïŒPVRTCã¯éå¯éç»åå§çž®åœ¢åŒã§ãïŒã
- PVRTCã¯PoverVRããŒããŠã§ã¢ã§ã®ã¿ãµããŒããããŸãã
- æ£æ¹åœ¢ã®POTãã¯ã¹ãã£ãã€ãŸãå¹
ãšé«ãã2ã®ã¹ãä¹ã§ãããã¯ã¹ãã£ããµããŒããããŸãããå Žåã«ãã£ãŠã¯é·æ¹åœ¢ã®ãã¯ã¹ãã£ããµããŒããããŸãã
- ãã¯ã¹ãã£ããã®åœ¢åŒã«å§çž®ãããšãæéããããå ŽåããããŸãã
å§çž®ã«ã¯ã
PVRTexToolã䜿çšã§ããŸãã
S3ãã¯ã¹ãã£å§çž®ïŒS3TCïŒãŸãã¯DirectXãã¯ã¹ãã£å§çž®ïŒDXTCïŒ
S3ãã¯ã¹ãã£å§çž®ã¯ãå§çž®ã¬ãã«ãåºå®ãããéå¯éã°ã©ãã£ãã¯ããŒã¿å§çž®åœ¢åŒã§ãã ãã®æ©èœã«ããããã®åœ¢åŒã¯ãã°ã©ãã£ãã¯ã¢ã¯ã»ã©ã¬ãŒã¿ã䜿çšããããã«èšèšããã3Dã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããã¯ã¹ãã£ã®å§çž®ã«æé©ã§ãã S3TCãšMicrosoft DirectX 6.0ããã³OpenGL 1.3ã®çµ±åã¯ããã®æ®åã«è²¢ç®ããŸããã å°ãªããšã5ã€ã®ç°ãªãS3TC圢åŒãªãã·ã§ã³ïŒDXT1ããDXT5ãŸã§ïŒããããŸãã ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã¯ãæãäžè¬çã«äœ¿çšããããªãã·ã§ã³ïŒDXT1ãDXT3ãããã³DXT5ïŒããµããŒãããŠããŸãã
DXT1ã¯æã匷åãªå§çž®ãæäŸããŸãã åå
¥å16ãã¯ã»ã«ãããã¯ã¯ã2ã€ã®16ãããRGB 5ïŒ6ïŒ5ã«ã©ãŒå€ãš2ããã4x4ã«ãã¯ã¢ããããŒãã«ã§æ§æããã64ããããããã¯ã«å€æãããŸãã éæ床ã®ãµããŒãã¯1è²ã«å¶éãããŠããŸãïŒ1ãããéæ床ïŒã
DXT3ã¯ã16ãã¯ã»ã«ã®åãããã¯ã128ããããã¢ã«ãã¡ãã£ãã«ããŒã¿ããšã«64ããããè²æ
å ±ããšã«64ãããã«å€æããŸãã DXT3ã¯ãéæãªé åãšäžéæãªé åã®éã®æ¥æ¿ãªç§»è¡ã䌎ãç»åãŸãã¯ãã¯ã¹ãã£ã«éåžžã«é©ããŠããŸãã ãã ããéæ床ã®ã°ã©ããŒã·ã§ã³ããªããç»åã«éæãªé åãããå Žåã¯ãDXT1ã®äœ¿çšãæ€èšãã䟡å€ããããŸãã
DXT5ã¯ãDXT3ãšåæ§ã«ã16ãã¯ã»ã«ã®åãããã¯ã128ããããã¢ã«ãã¡ãã£ãã«ããŒã¿ããšã«64ããããè²æ
å ±ããšã«64ãããã«å€æããŸãã ãã ããDXT3ãšã¯ç°ãªããDXT5ã¯ãéæé åãšäžéæé åã®éã®ã¹ã ãŒãºãªç§»è¡ã䌎ãç»åãŸãã¯ãã¯ã¹ãã£ã«é©ããŠããŸãã
ã¡ãªãã
- ãã¡ã€ã«ãµã€ãºã¯ãåæ§ã®PNGãã¡ã€ã«ãããã¯ããã«å°ãããªããŸãã
- 質ã®è¯ããè²ã®è³Šèª²ã«é¢é£ãã垯ç¶ã®ã¢ãŒãã£ãã¡ã¯ãã®å²åãäœãã
- åªããã³ãŒãã£ã³ã°ããã³ãã³ãŒãé床ã
- è€æ°ã®GPUã§ã®ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã ãã¹ã¯ãããã·ã¹ãã ã§ã¯ãã»ãŒãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã§ãµããŒããããŠãããAndroidãã©ãããã©ãŒã ã§åŸã
ã«é
åžãããŠããŸãã
æ¬ ç¹
- å質ã¯PNGã®å質ãããäœããªããŸãïŒS3TCã¯æ
å ±ã®æ倱ã䌎ãç»åå§çž®åœ¢åŒã§ãïŒã
- ãã¹ãŠã®Androidããã€ã¹ã§ãµããŒããããŠããããã§ã¯ãããŸããã
ãã®åœ¢åŒã§äœæ¥ããã«ã¯ã
DirectXã®DirectX Texture Tool ïŒDX SDKã«å«ãŸããŠããŸãïŒã䜿çšã§ããŸãã
ãã¯ã¹ãã£ããŒã¿ã«ã¢ã¯ã»ã¹ãã
å§çž®ãã¯ã¹ãã£ãä¿åããããã®ã»ãšãã©ã®ãã¡ã€ã«åœ¢åŒã«ã¯ãç»åããŒã¿ã®åã«ããããŒãå«ãŸããŠããŸãã éåžžãããããŒã«ã¯ããã¯ã¹ãã£å§çž®åœ¢åŒã®ååããã¯ã¹ãã£ã®å¹
ãšé«ãããã®è²æ·±åºŠãããŒã¿ãµã€ãºãå
éšåœ¢åŒãããã³ãã¡ã€ã«ã«é¢ãããã®ä»ã®æ
å ±ã«é¢ããæ
å ±ãå«ãŸããŠããŸãã
ç§ãã¡ã®ç®æšã¯ãããŸããŸãªãã¡ã€ã«ãããã¯ã¹ãã£ããŒã¿ãããŒããããããã2次å
ã¢ãã«ã«ãªãŒããŒã¬ã€ããŠãç»è³ªãšããŒã¿ãµã€ãºãæ¯èŒããããšã§ãã ã°ã©ãã£ãã¯ããŒã¿ã®åã«ããããããŒã¯ããã¯ã¹ãã£ã®äžéšãšããŠåŠçãããã¹ãã§ã¯ãããŸããããããç»åã®æçãšèŠãªããã¢ãã«ã«éãåããããšãæªã¿ãçºçããŸãã ããŸããŸãªãã¯ã¹ãã£å§çž®åœ¢åŒã®ãã¡ã€ã«ããããŒã¯ç°ãªããããå圢åŒã«ã¯åå¥ã®ãµããŒããå¿
èŠã§ããããã§ãªãå Žåããã¯ã¹ãã£ã®èªã¿èŸŒã¿ãšé©çšãæ£ããæ©èœããŸããã
泚æããŠãã ãã
PVRTCããããŒã¯ã64ããããã¯ã»ã«åœ¢åŒïŒãã®äŸã§ã¯mPixelFormatïŒã®ããŒã¿ã¡ã³ããŒã®ååšãèæ
®ããŠããã¯ãããŸãã ARMçšã«ã³ã³ãã€ã«ãããã³ãŒãã§ã¯ãããããŒã¯4ãã€ããè¿œå ãããŠæŽåãããŸãããã®çµæãå
ã®52ãã€ããã56ãã€ãã«ãªããŸãã ããã¯ãARMããã€ã¹ã§è¡šç€ºããããšãã«ã€ã¡ãŒãžãæªããšããäºå®ã«ã€ãªãããŸãã Intelããã»ããµçšã«ã³ã³ãã€ã«ãããã³ãŒãã§ã¯ãããã¯èµ·ãããŸããã ããããŒããã±ãŒãžã¯ãARMããã€ã¹ã®ã¢ã©ã€ã¡ã³ãã®åé¡ã解決ãããããARMããã€ã¹ãšIntelããã€ã¹ã®äž¡æ¹ã§ãã¯ã¹ãã£ãæ£ãã衚瀺ãããŸãã
ã¿ã€ãã«ã®é
眮ã«ãã£ãŠçããARMããã€ã¹äžã®ç»åã®æªã¿ã¯æ¬¡ã®ããã«ãªããŸãããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠ
以äžã«ãã©ã°ã¡ã³ãã瀺ãAndroid Texture Compressionã®äŸã«ããã誰ãã5ã€ã®åœ¢åŒã®ãã¯ã¹ãã£ã®å質ããã°ããæ¯èŒã§ããŸãã ã€ãŸããããŒã¿ãã«ãããã¯ãŒã¯ã°ã©ãã£ãã¯ã¹ïŒPNGïŒããšãªã¯ãœã³ãã¯ã¹ãã£å§çž®ïŒETCïŒããšãªã¯ãœã³ãã¯ã¹ãã£å§çž®2ïŒETC2ïŒãPowerVRãã¯ã¹ãã£å§çž®ïŒPVRTCïŒãããã³DirectXãã¯ã¹ãã£å§çž®ïŒDXTCïŒãšåŒã°ããããšãããS3ãã¯ã¹ãã£å§çž®ïŒS3TCïŒã§ãã ã
ãã®äŸã¯ãAndroidã®OpenGL ESã䜿çšããŠãããã®åœ¢åŒã®ãã¯ã¹ãã£ãããŒãããã³äœ¿çšããæ¹æ³ã瀺ããŠããŸãã ç°ãªã圢åŒã§ä¿åãããç»åã¯é£ãåã£ãŠé
眮ãããããããµã€ãºãšå質ãæ¯èŒã§ããŸãã ç¹å®ã®ãããžã§ã¯ãã®å§çž®ãã¯ã¹ãã£ãä¿åããã®ã«æé©ãªåœ¢åŒãéžæãããšãéçºè
ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãµã€ãºãèŠèŠçãªç»è³ªãããã©ãŒãã³ã¹ã®é©åãªãã©ã³ã¹ãèŠã€ããããšãã§ããŸãã
ãã®äŸã§ã¯ãå圢åŒã®ãã¡ã€ã«ã«ä¿åãããŠããç»åãèªã¿èŸŒãŸããã¢ãã«äžã®ãªãŒããŒã¬ã€ã®åº§æšã決å®ãããåãã¯ã¹ãã£ã®ãã©ã°ã¡ã³ãã衚瀺ãããŸãã çµæã¯ã察å¿ãã圢åŒã®4ã€ã®ãã¯ã¹ãã£ã«åå²ãããåäžã®ç»åã§ãã ãã©ãŒãããã¯ç»é¢äžéšã«è¡šç€ºããããã¡ã€ã«ãµã€ãºã¯ä»¥äžã«è¡šç€ºãããŸãã
ããã§èª¬æããäŸã¯ãWilliam Guoãäœæããã³ãŒãã«åºã¥ããŠããŸãã Intel Graphics Specialistã®Christiano Ferreiraãããã¯ã¹ãã£å§çž®ETC2ã®äœ¿çšäŸãè£è¶³ããŸããã
ããããã³ãŒããããŠã³ããŒãã§ããŸãã
ãã¯ã¹ãã£å§çž®åœ¢åŒïŒãµã€ãºãšå質PNGããŠã³ããŒã
ãã®ç®çã®ããã«ç¹å¥ã«äœæãããKhronos OpenGLã®åçŽãªglGenerateMipmapé¢æ°ã䜿çšããŠãPNG MIPã«ãŒããæäœã§ããŸãã Sean Barretãæºåããã³ãŒããstb_image.cïŒäžè¬å
¬éãããŠããŸãïŒã䜿çšããŠãPNGãã¡ã€ã«ãèªã¿åããããŠã³ããŒãããŸããã ãã®ã³ãŒãã¯ãåŠçããå¿
èŠããããã¯ã¹ãã£ã®äžéšãèŠã€ããŠéžæããããã«ã䜿çšãããŸãã
// glTexImage2D( GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, pData ); // MIP- glGenerateMipmap( GL_TEXTURE_2D );
ETC / ETC2ãããŠã³ããŒã
åè¿°ã®ããã«ãETCãã¯ã¹ãã£ã¯KTXããã³PKMãã¡ã€ã«ã«ä¿åã§ããŸãã KTXã¯ãè€æ°ã®ç»åã®ã³ã³ãããšããŠäœ¿çšãããæšæºã®å§çž®åœ¢ââåŒã§ãããMIPã«ãŒãã®äœæã«æé©ã§ãã åæ§ã«ãPKMã¯åã
ã®å§çž®ç»åãä¿åããããã«äœæããããããããã«åºã¥ããŠMIPã«ãŒããäœæããã«ã¯ãå€ãã®ãã¡ã€ã«ãçæããå¿
èŠããããéå¹ççã§ãã ãã®äŸã§ã®ETCã®MIPã«ãŒãã®ãµããŒãã¯ãKTX圢åŒã«å¶éãããŠããŸãã
Khronosã¯ãKTXãã¡ã€ã«ããã®MIPã«ãŒãã®èªã¿èŸŒã¿ããµããŒããããCã§èšè¿°ããããªãŒãã³ãœãŒã¹ã©ã€ãã©ãªïŒlibktxïŒãæäŸããŸãã ãã®ã©ã€ãã©ãªã䜿çšãããã¯ã¹ãã£ã®ããŒããæ
åœããLoadTextureETC_KTXé¢æ°ã«ã³ãŒããå®è£
ããŸããã KTXãã¡ã€ã«ãçŽæ¥ããŠã³ããŒãããæ©èœã¯ãktxLoadTextureMãšåŒã°ããŸãã ã¡ã¢ãªå
ã®ããŒã¿ããç®çã®ãã¯ã¹ãã£ãããŒãã§ããŸãã ãã®é¢æ°ã¯libktxã©ã€ãã©ãªã®äžéšã§ããããã®ããã¥ã¡ã³ã
ã¯Khronos Webãµã€ãã«ãããŸãã
以äžã¯ããã¯ã¹ãã£ãåæåããETCïŒKTXïŒåœ¢åŒã®MIPã«ãŒããµããŒããæäŸããã³ãŒãã¹ããããã§ãã
// (handle) GLuint handle = 0; GLenum target; GLboolean mipmapped; KTX_error_code result = ktxLoadTextureM( pData, fileSize, &handle, &target, NULL, &mipmapped, NULL, NULL, NULL ); if( result != KTX_SUCCESS ) { LOGI( "KTXLib couldn't load texture %s. Error: %d", TextureFileName, result ); return 0; } // glBindTexture( target, handle );
PVRTCãããŠã³ããŒã
PVRTCãã¯ã¹ãã£ã®MIPã«ãŒããµããŒãã¯ãããå°ãè€éãªã¿ã¹ã¯ã§ãã ããããŒãèªã¿åã£ãåŸãããããŒãµã€ãºãšã¡ã¿ããŒã¿ã®åèšã«çãããªãã»ããã決å®ãããŸãã ã¿ã€ãã«ã®åŸã«ã¡ã¿ããŒã¿ãããããããã¯ç»åã®äžéšã§ã¯ãããŸããã çæããããããã¬ãã«ããšã«ããã¯ã»ã«ã¯ãããã¯ã«ã°ã«ãŒãåãããŸãïŒéãã¯ããšã³ã³ãŒãããã¯ã»ã«ããã4ãããã2ããããã«ãã£ãŠç°ãªããŸããäž¡æ¹ãšãPVRTCã«é©ããŠããŸãïŒã 次ã«ãå¢çã®æ€çŽ¢ãè¡ããããããã¯ã®å¹
ãšé«ããåºå®ãããŸãã 次ã«ãé¢æ°glCompressedTexImageïŒïŒãåŒã³åºãããå§çž®ãããPVRTC圢åŒã®2次å
ç»åãèå¥ããŸãã 次ã«ããã¯ã»ã«ããŒã¿ã®ãµã€ãºãèšç®ããããããã®æ¬¡ã®ãã©ã°ã¡ã³ãã®ãã¯ã»ã«ã®ã»ãããã°ã«ãŒãåããããã«ã以åã«èŠã€ãã£ããªãã»ããã«äœãèµ·ãã£ãã®ããè¿œå ãããŸãã ãã®ããã»ã¹ã¯ãããããæ§æãããã¹ãŠã®ãã¯ã¹ãã£ãåŠçããããŸã§ç¹°ãè¿ãããŸãã
// unsigned int offset = sizeof(PVRHeaderV3) + pHeader->mMetaDataSize; unsigned int mipWidth = pHeader->mWidth; unsigned int mipHeight = pHeader->mHeight; unsigned int mip = 0; do { // ( * * bbp/8), 32 unsigned int pixelDataSize = ( mipWidth * mipHeight * bitsPerPixel ) >> 3; pixelDataSize = (pixelDataSize < 32) ? 32 : pixelDataSize; // glCompressedTexImage2D(GL_TEXTURE_2D, mip, format, mipWidth, mipHeight, 0, pixelDataSize, pData + offset); checkGlError("glCompressedTexImage2D"); // , â 1 mipWidth = ( mipWidth >> 1 == 0 ) ? 1 : mipWidth >> 1; mipHeight = ( mipHeight >> 1 == 0 ) ? 1 : mipHeight >> 1; // offset += pixelDataSize; mip++; } while(mip < pHeader->mMipmapCount);
ããŠã³ããŒãS3TC
S3TCãã¯ã¹ãã£ãä¿åãããã¡ã€ã«ãããŠã³ããŒãããåŸããã®ãã©ãŒãããã決å®ãããããããŒã®åŸãã«ããMIPã«ãŒããèªã¿åãããŸãã ããããã©ã°ã¡ã³ãã¯ãã€ãã¹ããããã¯ã»ã«ã¯ãããã¯ã«ã°ã«ãŒãåãããŸãã 次ã«ãå§çž®ããŒã¿å
ã®2次å
ç»åãèå¥ããããã«ãglCompressedTexImageïŒïŒé¢æ°ãåŒã³åºãããŸãã 次ã«ããããã¯ã®åèšãµã€ãºããªãã»ããã«è¿œå ãããããããããã®æ¬¡ã®ãã©ã°ã¡ã³ãã®å
é ãèŠã€ããŠåãã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã ããã¯ããã¹ãŠã®ãããã¬ãã«ãåŠçããããŸã§ç¹°ãè¿ãããŸãã 以äžã¯ããã¯ã¹ãã£ãåæåããS3TC圢åŒã®MIPã«ãŒãã®ãµããŒããæäŸããã³ãŒãã¹ããããã§ãã
// // unsigned int offset = 0; unsigned int width = pHeader->mWidth; unsigned int height = pHeader->mHeight; unsigned int mip = 0; do { // // : size = ceil(<w>/4) * ceil(<h>/4) * blockSize unsigned int Size = ((width + 3) >> 2) * ((height + 3) >> 2) * blockSize; glCompressedTexImage2D( GL_TEXTURE_2D, mip, format, width, height, 0, Size, (pData + sizeof(DDSHeader)) + offset ); checkGlError( "glCompressedTexImage2D" ); offset += Size; if( ( width <<= 1 ) == 0) width = 1; if( ( height <<= 1 ) == 0) height = 1; mip++; } while( mip < pHeader->mMipMapCount );
çµè«
ç¹å®ã®ç¶æ³ã«å¿ããŠãå§çž®ãã¯ã¹ãã£ã®ä¿åã«æé©ãªåœ¢åŒãéžæãããšãç»åã®å€èŠ³ãæ¹åãããã¢ããªã±ãŒã·ã§ã³ã®ãµã€ãºã倧å¹
ã«åæžãããããã©ãŒãã³ã¹ã倧å¹
ã«æ¹åãããŸãã æé©ãªãã¯ã¹ãã£å§çž®æ¹æ³ãæ
éã«éžæããããšã«ãããéçºè
ãšãã®ã¢ããªã±ãŒã·ã§ã³ã«æ·±å»ãªç«¶äºäžã®åªäœæ§ãäžããããšãã§ããŸãã Android Texture Compressionãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã¯ãAndroidç°å¢ã§æãäžè¬çãªåœ¢åŒã®ãã¯ã¹ãã£ãæäœããæ¹æ³ã瀺ããŠããŸãã
ã³ãŒãã
ããŠã³ããŒããããããžã§ã¯ãã«æé©ãªãã¯ã¹ãã£å§çž®åœ¢åŒã®ãµããŒããè¿œå ããŸãã