게임

수동 밉맵(mipmap)

by 조루나 posted Sep 11, 2020
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄


Honeycam 2020-09-11 00-48-14.gif5.7 MB

 

유니티가 기본 지원하는 밉맵 자동 생성은 영 시원찮아서

주워다 쓰는 중인 수동 밉맵 생성

 

포-토샵으로 줄여서 미리 이미지를 이름 맞춰서 넣으면 적당히 적당히 밉맵을 세팅해준다.

문제는 버그가 좀 있어서 파일을 함부로 넣었다만 무한 로딩 iteration에 빠지게 된다는 것.

오늘도 까먹어서 삽질 좀 했으므로 기록하여둔다.

 

유니티 에셋 폴더에 크키 조절한 이미지 파일을 밉맵이 적용되지 않게 이름을 적당히 바꿔서 먼저 집어 넣고

로드가 다 되고 나면 .mip1 .mip2 이런식으로 제대로 이름을 수정하면 무한 로딩에 빠지지 않는다. (유니티 에디터 프로젝트 창 안에서 하나씩)

 

 

 

https://www.programmersought.com/article/62534451752/

 

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text.RegularExpressions;

public class TestTextureIporter : AssetPostprocessor {
    bool m_isReadable;
    bool m_importing;

    bool ShouldImportAsset(string path)
    {
        string pattern = GetMipmapFilenamePattern(path);
        string mip1Path = string.Format(pattern, 1);
        return File.Exists(mip1Path);
    }
    
    string GetMipmapFilenamePattern(string path)
    {
        var filename = Path.GetFileName(path);
        var filenameWithoutExtention = Path.GetFileNameWithoutExtension(path);
        var extension = Path.GetExtension(path);
        var directoryName = Path.GetDirectoryName(path);

        return Path.Combine(directoryName, filenameWithoutExtention + ".mip{0}" + extension);
    }

    void OnPreprocessTexture()
    {
        string extension = Path.GetExtension(assetPath);
        string filenameWithoutExtention = Path.GetFileNameWithoutExtension(assetPath);
        var match = Regex.Match(filenameWithoutExtention, @".mip(\d)+$");

        if(match.Success)
        {
            string filenameWithoutMip = filenameWithoutExtention.Substring(0, match.Index);
            string directoryName = Path.GetDirectoryName(assetPath);
            string mip0Path = Path.Combine(directoryName, filenameWithoutMip + extension);

            TextureImporter importer = (TextureImporter)TextureImporter.GetAtPath(mip0Path);
            if(importer != null)
                importer.SaveAndReimport();
        }

        if (ShouldImportAsset(assetPath))
        {
            m_importing = true;

            string pattern = GetMipmapFilenamePattern(assetPath);
            int m = 1;

            bool reimport = false;

            while(true)
            {
                string mipPath = string.Format(pattern, m);
                m++;

                TextureImporter importer = (TextureImporter)TextureImporter.GetAtPath(mipPath);
                if(importer != null)
                {

                    if(!importer.mipmapEnabled || !importer.isReadable)
                    {
                        importer.mipmapEnabled = true;
                        importer.isReadable = true;
                        importer.SaveAndReimport();

                        reimport = true;
                    }
                    continue;
                }
                else
                {
                    break;
                }
            }

            if(reimport)
            {
                m_importing = false;
                return;
            }
            TextureImporter textureImporter  = (TextureImporter)assetImporter;
            m_isReadable = textureImporter.isReadable;
            textureImporter.isReadable = true;
        }
    }

    void OnPostprocessTexture(Texture2D texture)
    {
        if (m_importing)
        {
            string pattern = GetMipmapFilenamePattern(assetPath);

            for (int m = 0; m < texture.mipmapCount; m++)
            {
                var mipmapTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(string.Format(pattern, m));

                if(mipmapTexture != null)
                {
                    Color[] c = mipmapTexture.GetPixels(0);
                    texture.SetPixels(c, m);
                }
            }
            
            texture.Apply(false, !m_isReadable);
            TextureImporter textureImporter  = (TextureImporter)assetImporter;
            textureImporter.isReadable = m_isReadable;
        }
    }
}