메뉴 건너뛰기

게임
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
번호 분류 제목 글쓴이 날짜 조회 수
53 게임 콜라이더 달린 총알 최적화하기 11 file 조루나 2020.06.11 489
52 게임 텍스쳐 쓰까쓰까 쉐이더 (SplatMap) - UV 스케일링 가능하게 업데이트 1 file 조루나 2020.06.18 397
51 게임 아! Texture의 Mesh Type 너무너무 무섭다. 1 file 조루나 2020.07.07 276
50 게임 멀티텍스쳐 쉐이더가 너무 무거워서 최적화를 위해 Bake file 조루나 2020.07.11 279
49 게임 남의 쉐이더가 역시 좋구만 file 조루나 2020.07.17 622
48 음악 직접 만든 신데마스 매쉬업 리믹스 3곡을 올려보겠습니다 2 file deric99 2020.07.31 193
47 게임 씬에 몬스터 박기 편하라고 미리보기 만들기 1 file 조루나 2020.08.12 327
46 게임 뭐! 지도에 캐릭터 위치를 보여달라고! 1 file 조루나 2020.08.20 340
45 게임 2D 게임이라도 팝콘이 튀기고 싶어 file 조루나 2020.09.09 256
» 게임 수동 밉맵(mipmap) 유니티가 기본 지원하는 밉맵 자동 생성은 영 시원찮아서 주워다 쓰는 중인 수동 밉맵 생성 포-토샵으로 줄여서 미리 이미지를 이름 맞춰서 넣으면 적당히 적당히... 3 file 조루나 2020.09.11 323
43 게임 버프버프 2 file 조루나 2020.09.22 235
42 게임 엔터 더 건전 따라서 UI에 현재 무기 그림이 나오게 해달라기에. 1 file 조루나 2020.10.16 307
41 게임 총알 방패막 + 회전회오리슛 1 file 조루나 2020.10.27 291
40 게임 3D 입문. Vroid Studio로 날먹 해보기. file 조루나 2020.11.09 321
39 게임 3D 입문2. Mixamo 애니메이션으로 날로 먹기 1 file 조루나 2020.11.10 258
38 게임 스프라이트 하프 밉맵 file 조루나 2020.11.20 201
37 게임 스크롤러 에셋과 VerticalLayoutGroup의 저주 file 조루나 2021.03.10 250
36 게임 2D 쿼터뷰 게임의 스프라이트 Sorting Order 정렬 방법 file 조루나 2021.04.30 287
35 게임 2D 쿼터뷰 타일 게임을 3D처럼 해달라잖아! file 조루나 2021.05.27 262
34 게임 게임에 한 붓 그리기 퍼즐을 넣고 싶다길래... file 조루나 2021.07.15 201
Board Pagination Prev 1 2 3 Next
/ 3