메뉴 건너뛰기

게임
2020.09.11 00:58

수동 밉맵(mipmap)

조회 수 323 추천 수 0 댓글 3


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;
        }
    }
}
 

 

 


  • 유사당 2020.09.20 12:40

    이런식의 그래픽 셋팅은 3D모델링에 2D텍스쳐를 입힌건가요?

  • 조루나 2020.09.20 18:27
    아니요.
    98% 다 2D 스프라이트 이펙트입니다.
  • 유사당 2020.09.21 14:20
    아하 3D 카툰렌더링처럼 보이는게 매우 신기합니다
사진 및 파일 첨부

여기에 파일을 끌어 놓거나 왼쪽의 버튼을 클릭하세요.

파일 용량 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
13 게임 총알 방패막 + 회전회오리슛 1 file 조루나 2020.10.27 291
12 게임 엔터 더 건전 따라서 UI에 현재 무기 그림이 나오게 해달라기에. 1 file 조루나 2020.10.16 307
11 게임 버프버프 2 file 조루나 2020.09.22 235
» 게임 수동 밉맵(mipmap) 유니티가 기본 지원하는 밉맵 자동 생성은 영 시원찮아서 주워다 쓰는 중인 수동 밉맵 생성 포-토샵으로 줄여서 미리 이미지를 이름 맞춰서 넣으면 적당히 적당히... 3 file 조루나 2020.09.11 323
9 게임 2D 게임이라도 팝콘이 튀기고 싶어 file 조루나 2020.09.09 256
8 게임 뭐! 지도에 캐릭터 위치를 보여달라고! 1 file 조루나 2020.08.20 340
7 게임 씬에 몬스터 박기 편하라고 미리보기 만들기 1 file 조루나 2020.08.12 327
6 음악 직접 만든 신데마스 매쉬업 리믹스 3곡을 올려보겠습니다 2 file deric99 2020.07.31 193
5 게임 남의 쉐이더가 역시 좋구만 file 조루나 2020.07.17 622
4 게임 멀티텍스쳐 쉐이더가 너무 무거워서 최적화를 위해 Bake file 조루나 2020.07.11 279
3 게임 아! Texture의 Mesh Type 너무너무 무섭다. 1 file 조루나 2020.07.07 276
2 게임 텍스쳐 쓰까쓰까 쉐이더 (SplatMap) - UV 스케일링 가능하게 업데이트 1 file 조루나 2020.06.18 397
1 게임 콜라이더 달린 총알 최적화하기 11 file 조루나 2020.06.11 489
Board Pagination Prev 1 2 3 Next
/ 3