디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[📜일지] Frostory 픽셀 퍼펙트 세팅

특수한발가락갤로그로 이동합니다. 2020.08.15 04:25:22
조회 6166 추천 33 댓글 30
														


안녕하세요!


이제 슬슬 데모를 공개할 시기가 다가와서, 게임의 완성도를 높이기 위해 여러 작업을 하고 있습니다

이번에는 그 중에서 픽셀 퍼펙트하게 만들기 위해 삽질을 했던 내용에 대해서 써봅니다.



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d904072c7aad1192352b76445428d61

처음에 이 게임을 만들 때에는 픽셀 퍼펙트에 대해서 크게 신경쓰지 않았습니다.

그런데 친구가 픽셀 퍼펙트해야 그림이 괜찮게 나온다고 해서, 같이 좀 알아봤습니다.

조사해보니 픽셀을 처리하는 방식도 종류가 다양했습니다.



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d90407295fb84132555ec30bf53f3a6

완벽한 픽셀 퍼펙트


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d904072c0a986487205e23762a70b0a

픽셀 회전은 허용하는 경우


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d90407295ae821e7606e7378c42c3c3

snap은 하지 않은 경우 (배경과 캐릭터가 살짝 어긋나있음)


이런 방식들이 다 각기다른 장단점이 있었습니다.

예를 들면 완벽한 픽셀 퍼펙트는 정지된 상태에서 가장 흠잡을 데 없게 나오고, 가장 레트로느낌이 많이 납니다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f690bf8cc8637b30d0130978103e2061e2e4cab25742ae4a viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f690bf8cc8637b30d0130978136a263ae5e2c8b55742ae4a

하지만 회전할 때 픽셀이 잘게 부서지는 게 느낌이 안좋았습니다. (사과의 움직임)

이건 아트스타일이나 취향에 따라서 판단해야겠지만, 저희의 경우에는 그냥 픽셀이 돌아가는 게 좀 더 낫다고 결론을 내렸습니다.


그리고 snap의 경우에도 여러 방법이 있었고, 각 방법별로 특징이 달랐습니다.

정리하자면 다음과 같습니다.


1. 강제로 snap시킨 경우

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f690bf8cc8637b30d0130978153f263be9b899e75742ae4a

- 딱 원하는 크기의 렌더 텍스처를 만들어서 거기에 렌더링하거나(upscaling), 모든 스프라이트 꼭짓점 좌표를 정확히 픽셀단위로 반올림하는 경우(pixel snapping)

- 완벽하게 픽셀 퍼펙트하지만, 카메라 움직임도 픽셀단위가 됨

- 작은 움직임에도 픽셀이 툭 툭 하고 움직이는 특유의 느낌이 존재

- 레트로느낌의 게임이나, 640x480처럼 고정 해상도 게임에 적합



2. 실제로 snap된 경우 (모든 오브젝트들의 좌표가 픽셀 단위)

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f690bf8cc8637b30d01309784269206de5e0cde55742ae4a

- 부드럽게 카메라를 움직일 수 있음 (화면 픽셀단위로)

- 물리를 구현하는 것이 어려움



3. snap을 안하는 경우

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f690bf8cc8637b30d01309784538743ae7b9cab55742ae4a

- 카메라도 부드럽게 움직이고, 오브젝트도 부드럽게 움직임

- 단점으로는 배경과 캐릭터가 픽셀적으로 어긋나는 glitch 발생

- 카메라가 움직이면서 정지한 오브젝트가 조금씩 왔다갔다하는 문제도 발생(움짤에서 왼쪽 나무)



각 장단점을 생각해보고 결국 snap을 안하기로 결정했습니다.

snap을 할까도 생각했는데, 픽셀단위로 움직임을 계산을 할 엄두가 나지 않았습니다.

그리고 유니티 물리 엔진의 부드러운 느낌도 괜찮다고 생각했습니다.


그렇게 결정하고 생각해보니 정지한 물체는 딱히 물리적인 움직임이 없다는 것을 깨닫고, 정지한 물체의 경우에만 따로 pixel snapping을 해서 왔다갔다 하는 문제를 해결했습니다.


대충 이런 결정을 했지만, 아직 몇가지 해결해야할 문제가 남아있었습니다.



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7a463713cd55bbabdafa356d070ca270cd0546dc28aeec986

픽셀 퍼펙트에 관련돼서 알아볼 때, 구글링 하면서 찾아보기도 하고 유니티 패키지도 공부해봤지만, 특히 엔터 더 건전을 많이 참고했습니다.

정말 연구해볼 수록 픽셀 관련 디테일한 처리에 놀랐습니다. 특히, 캐릭터의 모든 물리적인 움직임을 픽셀단위로 계산해서 snap하는 걸 알고는 충격을 받았습니다.


저희가 중점적으로 본 것은 해상도 옵션쪽인데, Scaling Mode를 제공해서 원하는 그래픽으로 세팅할 수 있습니다.

이런 옵션을 준 이유는, 컴퓨터 모니터 크기가 제각각이기 때문에 완벽한 비주얼을 표현하는 게 불가능하기 때문일 것입니다.

그래서 장단점을 비교하면서 유저가 선택할 수 있도록 한 거죠.

이런 옵션들을 정리해보면 다음과 같은 상황으로 나뉘게 됩니다.


1. 엔터 더 건전의 아트 픽셀(480x270)의 정수배 크기의 모니터의 경우(1920x1080,1440x810, ...)는 그냥 모니터 해상도로 세팅하면 완벽하다.

2. 그렇지 않은 경우가 대부분인데, 그럴 때는

- 픽셀 퍼펙트를 원한다면, 출력 범위를 조정해 픽셀 퍼펙트하게 만든다. (단, 레터박스가 생김)

- 좀 blurry해도 화면이 꽉 찬 걸 원하면, 렌더링은 적절하게 하고 그걸 화면크기에 맞도록 늘린다.


왜 이렇게 할 수밖에 없었는지를 이해하려면 우선 다음 개념을 이해해야합니다.


[아트 이미지]

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d904072c7ffd5122754b23c33dca8b9

표현하고자 하는 도트라고 보시면 됩니다. 엔터 더 건전의 경우 480x270, 저희 게임의 경우 320x180으로 미리 고정으로 보통 잡아둡니다.

결국 이 이미지를 예쁘게 확대해서 보여주는 테크닉이 중요합니다.


[스프라이트 Pixel Per Unit]

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d904072c0ac82182105e2671bff6b35

스프라이트는 결국 유니티 월드에 존재하게 됩니다.

이 때, 스프라이트 1픽셀이 월드에서 얼마만큼 클지를 세팅해줘야합니다.

기본값이 100PPU입니다. 즉, 100픽셀이 길이 1인 셈입니다.

이건 게임에 따라 정하기 나름인 것 같습니다.

저희는 타일 하나의 크기를 0.5로 두려고 타일이 18픽셀이니 36PPU로 세팅하고 있습니다.




[카메라 orthogonal size]

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d9040729ea6d71c7006e160e002b3d7


카메라가 담고 있는 월드의 y길이가 orthogonal size입니다.

스크린 비율에 따라 카메라는 자동으로 x길이를 조절합니다.

그러니 이 orthogonal size를 잘 계산해서 월드를 딱 맞게 담아야 합니다.

y기준으로 맞추고 싶다면 orthogonal size = H / PPU 이고,

x기준으로 맞추고 싶다면 orthogonal size = W / PPU * screenHeight / screenWidth 가 됩니다. (W는 아트 픽셀의 너비, H는 아트 픽셀의 높이)

그럼 만약에 스크린 사이즈와 상관없이 무조건 아트 이미지의 비율대로 표현하고 싶다면 어떨까요?

그건 카메라의 rect값을 조절해서 레터박스를 두면 됩니다.

카메라가 스크린에 투사하는 두 꼭짓점 min, max는 기본적으로 (0,0), (1,1)입니다.

만약 스크린이 4:3이고, 아트 픽셀이 16:9라면 (0, 0.125) (1, 0.875)로 잡으면 딱 맞게 됩니다.

만약 레터박스를 최대한 피하고 싶다면, 아트 픽셀 크기에 최소, 최대 크기 여유를 두는 방법이 있습니다.


[카메라 Back Buffer]


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7a463713cd55bbabdafa356d021c5210fd70369938a86538a


카메라는 Back Buffer(framebuffer)라고 불리는 렌더 텍스쳐에 월드를 렌더링을 하게 됩니다.

그러니 만약 Back Buffer 텍스쳐의 사이즈가 아트 이미지 크기와 정확히 일치한다면, 일단 픽셀 퍼펙트 한 것입니다. (다른 문제는 제쳐두고 생각했을 때)

그럼 Back Buffer 사이즈가 아트 이미지의 2배라면 어떨까요?

이 때도 완벽하게 픽셀 퍼펙트합니다. (이미지 참고)

그럼 만약에 1.5배라면 어떨까요?

픽셀이 깨지게 됩니다.

왜냐하면 한 픽셀에는 한 색깔정보밖에 저장하지 못하기 때문입니다.

그렇기에 레스터라이저에 의해 스케일링되는 과정에서 불규칙하게 픽셀이 튈 수밖에 없는 것입니다.

(사실 수학적인 공식에 따라 규칙적으로 픽셀을 스케일링하는 것이지만, 픽셀아트는 복잡한 이미지기 때문에 깨지는 것처럼 보이게 된다는 표현이 더 정확)

이를 좀 더 직관적으로 이해하자면 그래픽 프로그램을 통해 비슷한 상황을 재연할 수 있습니다.

중간에는 깨지다가 마지막에 정확히 2배가 되면서 정상적으로 보입니다.

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f690bf8cc8637b30d01309784269283be8e2cfe05742ae4a


잡담이 길었지만 결론은 Back Buffer 사이즈는 아트 이미지 크기의 정수배여야 된다는 점입니다.

Screen.SetResolution함수를 통해 사이즈를 정할 수 있습니다.


[스크린 픽셀]

back buffer에 담긴 픽셀 정보는 결국 모니터를 통해 표현됩니다.

그리고 모니터 스크린은 고유 해상도(1920x1080, 2560x1440, ...) 픽셀로 이루어져 있습니다.


여기서 저희는 처음에 모니터 해상도와 Back Buffer의 크기가 안맞을 때 뭔가 문제가 발생할 거라고 생각했습니다.

그런데 막상 구현하고 보니, 모니터 해상도 크기가 Back Buffer크기의 정수배가 아니더라도 괜찮았습니다.

오히려 이 단계에서 신경써야하는 것은 아트 이미지의 크기입니다.

아트 이미지가 모니터 픽셀에 담길 때, 정수배가 아니라면 아까 위와 같은 문제가 발생하게 됩니다.

물론 모니터 해상도가 워낙 높다보니 별 티는 안나지만, 뭔가 선명하고 날카로운 느낌이 사라지게 됩니다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7a463713cd55bbabdafa356d070c4200a83096a968a4f88e4


작게 놓고 보면 알기 힘들지만, 큰 화면으로 보면 좀 더 제대로 느낄 수 있습니다.


그래서 이런 것들을 통해 간략화해서 다음과 같이 UI를 구성했습니다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d90407297ab821a710ee33055170fc8



이렇게 만들고 좀 한숨 돌리나 했더니 또 다른 문제가 발생했습니다.

바로 특정 해상도에서 이상하게 픽셀이 늘어지는 현상이 발견됐습니다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f690bf8cc8637b30d01309781838246ae7e49be75742ae4a


왜 이런 현상이 일어나는 건지 이해가 가지 않았습니다.

이것저것 스프라이트 옵션도 바꿔보고 카메라 옵션도 바꿔보면서 테스트를 해봤지만, 문제가 해결되지 않았습니다.

픽셀 계산할 때 반올림을 잘못했나 싶어서 코드다 다 헤집어봤지만 결과는 변하지 않았습니다.


그러던 중, 놀랍게도 해상도 너비 픽셀 수를 홀수로 하니까 정상적으로 작동했습니다.

확대 레벨이 홀수 일 때는, 해상도 너비 픽셀 수도 홀수로,

확대 레벨이 짝수 일 때는, 짝수로 세팅을 하니 문제가 사라졌습니다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92665228b1b724b050a3a76aab9f6d6e2d7c90d783ddfc345ea7f4d90407293a8871e2353b561dee2d952

이 불가사의한 일을 겪고 저와 제 친구는 한동안 충격에서 벗어나지 못했습니다.

일단 돌아는 가서 만족하지만, 여러 기기에서 테스트를 좀 해봐야될 것 같습니다.

혹시 이 문제에 대해서 아시는 분이 있다면 댓글로 알려주시기 바랍니다.



읽어주셔서 감사합니다!




-------------이전글---------------

1편 소개

2편 괴물

3편 약탈자

4편 파편시스템

5편 대쉬퍼즐

6편 브금소개

7편 스프라이트 순서 처리

9편 대화 시스템

10편 그래픽 리소스 제작과정

11편 레벨 프로토타입 영상

12편 지형 시스템

13편 버려진 레벨들

14편 무기 시스템

15편 룬 시스템

16편 폭탄 퍼즐 레벨

17편 몬스터 제작 과정

18편 모바일 최적화 삽질기

19편 특수효과 발전과정

20편 트리거 시스템

--------------------------

추천 비추천

33

고정닉 4

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
- 설문 며느리, 사위되면 시댁, 처가에 잘할 것 같은 스타 운영자 25/10/13 - -
174286 공지 인디 게임 개발 갤러리 규칙 - 질문 전 필독!! 파베르갤로그로 이동합니다. 24.12.04 5914 9
193761 공지 신문고 [3] 파베르갤로그로 이동합니다. 25.09.06 397 0
193433 공지 게임제작 초심자를 위한 글 모음 - Goranic 파베르갤로그로 이동합니다. 25.09.02 2041 7
123789 공지 뉴비 개임개발 하려는데 뭐부터 해야하나요 복사본 [22] 흉황갤로그로 이동합니다. 23.04.11 30626 54
196388 💬 셰이더 공부 이 영상 너무좋네 2호기갤로그로 이동합니다. 10:12 39 0
196387 💬 개발시작한지 4일차됐는데 알수가없구나 [1] ㅇㅇ(112.140) 09:18 136 0
196385 🐣질문 스팀게임 출시하면 친구들이 자동으로 알 수 있음? [1] Indie(220.90) 09:02 132 0
196384 💬 스팀 넥페에 왜 참여가 안 됐냐고 문의했는게 아직도 답변이 없네 [2] Indie(117.53) 07:48 163 0
196383 💬 게임은 종합선물세트임 ㅇㅇ갤로그로 이동합니다. 06:45 96 1
196382 💬 Gemini 3 근황... [2] ㅇㅇ갤로그로 이동합니다. 04:47 285 2
196381 💬 2년간 쓰던 GPT도 이제 내일로 끝이네 [2] dryrain갤로그로 이동합니다. 02:58 315 1
196380 💬 유니티 보안이슈때문에 버전업했는데 [3] 퍅셔미갤로그로 이동합니다. 02:45 184 3
196379 💬 심심해서 아이디어 가이 [2] dryrain갤로그로 이동합니다. 02:31 158 2
196378 💬 슬슬 재밋어짐 플레이 테스트 [1] -인.갤로그로 이동합니다. 02:12 238 3
196377 💬 예술은 종합게임임 [2] Indie(221.144) 01:38 172 0
196376 💬 의도하진 않았지만 자연스러우니 좋았으 겜나무갤로그로 이동합니다. 01:04 165 2
196375 💬 아트 때문에 개발의욕이 확 식어버림 [7] Indie(1.252) 00:56 369 1
196374 💬 지스타 떨어진 것 같아서 그냥 오늘 하루종일 우울했어 [9] Indie(220.65) 00:53 307 4
196373 🐣질문 이런 배경 아트는 난이도 어느정도임 [8] ㅇㅇ갤로그로 이동합니다. 00:45 353 0
196372 💬 포기하지 않고 하나하나 달성해야할 목표인듯 [2] 구미호s갤로그로 이동합니다. 00:42 127 1
196371 📚정보 [에셋 무료] Essential : Zombies Games + 1개 더 [7] r35갤로그로 이동합니다. 00:36 305 11
196370 📜일지 업그레이드 구현 방식 결정 + vInspector 팁 [13] 211214갤로그로 이동합니다. 00:18 215 2
196369 💬 게임은 종합예술임 [18] ㅇㅇ(114.200) 00:10 423 8
196368 💬 진짜 gpt 개 열받네 [2] Indie(211.43) 00:03 176 0
196367 💬 비버 페스티벌 가본사람? Indie(59.12) 10.16 102 0
196366 💬 지스타 인디 쇼케 메일온 사람 있음? [2] ㅇㅇ(121.135) 10.16 208 0
196365 💬 skyward flight media에서 내 게임 소개해줬다 [5] 박희종갤로그로 이동합니다. 10.16 225 8
196364 💬 형들 게임 개발할 때 assets 파일 어디서 만들어 [6] Indie(182.214) 10.16 150 0
196363 📜일지 권총 절차적 애니메이션을 만들어보았어 [2] DTTK갤로그로 이동합니다. 10.16 310 10
196361 💬 이것저것 추가한거 [1] indie갤로그로 이동합니다. 10.16 159 3
196360 💬 나만 유니티에디터 오래키면 렉걸림?? [7] ㅇㅇ갤로그로 이동합니다. 10.16 186 0
196359 💬 회전하는 메뉴 만들어봄 [5] 만들어보기갤로그로 이동합니다. 10.16 245 5
196358 💬 로우폴리 모델 만들어봤다 [7] ㅇㅇ(211.215) 10.16 361 9
196357 💬 모든 건 재능이다. [9] Indie(211.203) 10.16 400 8
196356 🤝구인 도트 SRPG '스타더스트'에서 아이템 아이콘 외주 작업자를 구인합니다. [4] 크니브스튜디오갤로그로 이동합니다. 10.16 455 12
196355 💬 형아들 혹시 언리얼 토너먼트 이거 지금도 유효해? [5] Indie(220.77) 10.16 171 0
196353 🤝구인 독창적인 체스 게임 개발 인원을 모집합니다.  [10] ㅇㅇ(121.139) 10.16 482 2
196352 💬 3명에서 만들어도 기획자가 프로그래머 짓 싹다 하면 [2] 착하게살자갤로그로 이동합니다. 10.16 257 0
196351 📜일지 그동안 만든 2D 오픈월드 컨텐츠들 [6] ㄹㅇㅋㅋ갤로그로 이동합니다. 10.16 373 4
196349 💬 포켓몬 za 보고 3D 개발에 힘을 얻음 [9] 사랑맛쿠키갤로그로 이동합니다. 10.16 316 1
196348 💬 C#은 더 많은 자료구조를 해방하라... [4] Ray.갤로그로 이동합니다. 10.16 301 3
196347 🐣질문 텍스트에 네모?가 왜 생기는건가요? [4] Indie(116.45) 10.16 245 0
196346 💬 스팀 이정도 여자 그림만 들어가도 전체이용가가 안되네요. [7] Indie(121.129) 10.16 447 0
196345 💬 요즘 이런 애들 많은거 같다.. [2] Indie(211.203) 10.16 370 0
196344 📚정보 Unreal Engine 5: Nanite, Lumen [16] pluto갤로그로 이동합니다. 10.16 390 11
196343 💬 살면서 느낀게 모든게 운7기3이더라 [19] ㅇㅇ(182.211) 10.16 717 9
196342 💬 UI 아틀라스 현업에서 어떻게 사용함? Indie(220.122) 10.16 145 0
196341 🐣질문 3d 레벨 디자인 추천 책 있으신가요?? [2] ㅇㅇ갤로그로 이동합니다. 10.16 132 0
196340 📢홍보 드래곤 서바이벌 체험판 출시 기념 경품 이벤트중..! Indie(125.189) 10.16 316 11
196339 💬 사려던 에셋 할인하는데...그래도 존나 비싸다... [9] 흑_두루미갤로그로 이동합니다. 10.16 225 2
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2