-
Notifications
You must be signed in to change notification settings - Fork 10
/
0122.txt
184 lines (184 loc) · 17.8 KB
/
0122.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
예~ 안녕하세요 포프입니다.
음~ 그 동안 사실 그래픽에 대한 이런 저런 이야기를 내가 많이 해왔는데..
포프TV에서는 상당히 비기너쪽 이야기는 별로 안했던 것 같아요.
사실 어찌 보면 제가 항상 하던 일이 비기너 쪽 일은 아니었기 때문에 그랬던 것일 수도 있고..
근데.. 최근에 어쩌다 질문을 받았기 때문에..
이 정도는 비기너라도 좀 알고 시작을 하면 좋을 것 같아서 말을 해야겠다 싶어서 말을 하는 거예요.
그.. 텍스쳐 압축에 대해서 얘길 해볼께요. 이제..
보통.. 이미지 압축이라고 얘기를 하면은.. 보통 JPEG이라던가 PNG 파일 포맷을 많이 생각하잖아요.
JPEG의 가장 큰 단점은! 음.. 퀄리티를 잃는 다는 것. 그래서 저희는 'Lossy Algorithm'이라고 하거든요?
그러니까 '퀄리티를 loss 한다' 하는 의미에서 Lossy Algorithm이라고 하고..
PNG 같은 경우에는 이제 Lossless라고 해서 압축을 해도 품질은 저하가 되지 않아요. 어제든..
압축을 다시 뽑아 낼 수 있는거죠. 압축을 풀면은..
ZIP파일 있죠. 'ZIP' 그것도 똑같은 개념이에요. ZIP파일 넣었다가 다시 압축을 풀었을 때 원래 컨텐츠가 나오잖아요?
그러면 이건 'Lossless'라고 하는 거죠..
그러면 왜? 'Lossy Algorithm'을 저희가 그렇게 쓰냐~
그러면.. 크기 때문이예요.. 이미지 같은 경우는 사람이..
눈을 보는 거고.. 사람의 눈이 솔직히 뭐 그렇게 뛰어나지가 않기 때문에..
픽셀들을 막 섞어 놓으면 약간 퀄리티가 떨어지고 그 인접한 픽셀 두 세개 그냥 같이 같은 색으로 바꿔 버려도?
사실은 사람 눈으로 캐치가 안된다구요..
그리고 특히 이미지라는게..
뭐.. 벡터 그래픽 처럼 아주 깔끔한 외곽선 이런거라면 문제가 되지만..
그런 것이 아니라 일반 생활에서 보는 그런 텍스쳐들 뭐..
나무무늬라던가.. 무슨 뭐 돌 같은 거..
뭐.. 대리석 같은 거 무늬라던가~
그런.. 아스팔트 무늬라던가~ 이런거 약간 좀 굉장히
노이즈가 많이 껴있는 패턴이기 때문에..
거기서 약간 더 노이즈가 들어가고 직접 퀄리티가 줄어들더라도 사람 눈으로 인식을 못하는 거죠..
그래서 그런 개념으로 시작한게 일단 이미지 압축이란 개념인데..
뭐.. ZIP파일 풀어보신 분들도 알겠지만.. ZIP파일 풀 때 시간이 되게 오래 걸리잖아요.. 그래서..
사실.. 컴퓨터 그래픽에서~ 이미지 압축을 했을 때 그 압축을 얼마나 실시간으로 빨리 풀어가지고 화면에 보여줄 수 있느냐가 중요한 거예요.
이미지 압축을 컴퓨터에서 하는 이유는..
메모리.. 보통 컴퓨터 메모리가 한계가 있잖아요.
컴퓨터 메모리가.. GPU 메모리가.. 거기에 텍스쳐를 올려놓고 그것을 곧바로 뽑아야 되는데 그 용량이 크면 클수록.. 밴드위스도 커지고..
그만큼 속도가 느려지기 때문에 그걸 빠르게 하기 위해 메모리에서는 어느정도 작게 메모리를 먹고 있지만?
그.. 실제 화면에 그려줄 때 실시간으로 이것을 압축을 풀어줘서 원래 이미지를 복원해내는 그런 기술도 중요시하게 되죠.
그래서 ZIP파일 같은 포맷은 절대 좋은 포맷이 아니고..
뭐.. 예전에 뭐..
구글에서 새로 개발한 이미지 압축 그런것을 보신 분이 있는지 모르겠어요. 비디오로 한번 돌았었는데..
그건 진짜 용량이 작아지거든요. 그런데 그게 곧바로 GPU에서 돌리기에는 그런 속도상의 문제가 있어요.
그럼 GPU쪽에서는 어떻게하냐? JPEG 쓰냐?..
JPEG안써요. 왜냐하면..
JPEG은 압축을 해보시면 알겠지만..
압축을 할 때마다 파일 크기도 달라지고 그리고 어떤 픽셀이 있느냐에 따라 그 모든게 다 틀려지거든요.
그래서.. 일정하게 정해진.. 그러니까.. 완벽하게 수학 공식만으로 풀 수 없는 그런 압축 알고리즘이 돼요.
뭐 IF문 쓰게되고.. IF~ ELSE 쓰게되면.. 브랜치문 쓸때마다 아무래도 그런.. 성능이 떨어지게되고..
그리고 또 하나의 단점은 그렇게 브랜치문을 쓰면 쓸수록 이 압축을 푸는 알고리즘 자체를 하드웨어 적으로 못 만드는거죠.
소프트웨어로 만들 수 있어요. 그런데 소프트웨어가 아니라 자체 칩에다가 하드웨어 수준에서 지원을 할 수 있으면.. 이게 훨씬 빨라지겠죠.
그래서.. GPU쪽 그러니까.. 컴퓨터 그래픽 쪽에서 쓰는
이미지는 언제나 그렇게 쉽게 풀 수 있는 압축을 써요.
그래서 처음에 나왔던게.. 뭐 처음에 나온건 아니겠죠.
한동안 뭐..
요즘.. 아이폰이나 이런거 하시는 분들은..
ETC 포맷이라고 보셨을 거구요.
그게 이제.. 말그대로..
그.. 이미지에서 아마 4x4인가? 8x8 픽셀 일 거에요.
그렇게 정사각형 픽셀을 4개x4개면 16개..
8개 x 8개면 64개.. 이걸 뽑아서 그 안에 패턴을 분석을 해서..
거기서.. 뭐.. 최종.. 가장 가까운 색을 뽑아내는 건가?
아니.. 아니다! ETC포맷은 제가 알기로는 그냥..
칼라를 몇 단계로 하는 걸 거에요.. 뭐.. 칼라가 뭐 이렇게 부드럽게 연결이되면.. 그것을 그냥 4비트 단위로 잘라가지고..
이렇게 딱딱딱~ 중간 값만 딱딱 보여주고 그중에 하나만 쓰게.. 그래서..
ETC포맷으로 압축을 하면은 퀄리티가 떨어지는 경우가 많죠..
ETC포맷에서 하나 더 발전한게..
저희가 컴퓨터 쪽에서 DirectX9 에서.. 지난 10년간 써왔던 DXT 포맷이라는게 바로 그거에요.
DXT1 포맷이라는게 있고.. 뭐 DXT1, 2, 3, 4, 5 가 있는데..
솔직히 가장 프로그래머가 많이 썼던 것은 DXT1하고 DXT5 였죠.
이 개념은 뭐였냐면.. 둘다 개념은 비슷해요~
이것은 4x4 블럭을 찾아내요. 그래서 모든 4x4 블럭마다.. 색상이 16개가 들어가잖아요. 그러면..
거기서 가장 최대의 색상과 가장 최소의 색상을 하나씩 뽑은 다음에..
그 중간 단계를 2개로 놓는 거에요. 총 4가지 색상을 표현하는건데..
최대값. 최소값을 뽑아놓고 그 중간 단계는 이 중간과 이 중간의 1/3, 2/3 이렇게해서 계산을 하는 거죠.
그러면 실제 메모리에 집어 넣을 때는..
이 두가지 색을 넣구요. 실제 색으로는~ 뭐.. RGB 888은 아니에요.
5바이트 6바이트 5바이트로 넣어요.
그것도 좀 더 압축을 하기 위해서인데..
그리고.. 사람 눈은 빨강이나..
그러니까.. 빨강이나 파랑보다는 녹색이 화면의 밝기. Luminance(휘도)를 좌지우지 하는 그게.. 많고
사람눈은 역시 그 Luminace에.. 밝기에.. 훨씬 더.. 명도라고 하죠? 한국말로.. 그것에 대해서 민감하게 반응을 하기 때문에..
Green(녹색) 채널에 좀 더 강도를 주는 것 뿐이구요.
그래서 그 두 색을 565, 565로 집어넣으면 하나당 16바이트니까 32비트가 되요. 그러면 그렇게 4바이트로 들어가고~
그러면.. 나머지 단계는..
아까 말했듯이 색이 4개중에 하나 잖아요.
뭐.. 최소 값이 0이라면 최대 값이 3이고? 그 중간은 1, 2가 되겠죠.
그러면 이것은 두비트로 넣을 수 있다구요. 그러면은 각 픽셀마다 두비트로 인덱스를 넣어주는 거에요 0에서 3사이에..
그러면 아까 16픽셀이었죠? 그러면 그게 32픽셀이 다시되요. 그러면..
아까 말한 4바이트. 색상 표현하는 거. 인덱스 4바이트해서 이게 8바이트가되요.
그러면 4x4 블럭. 16개 색상을 표현하는데.. 아.....
4바이트.. 4바이트.. 8바이트면 되는거에요.
그런데 일반 RGBA 채널로 이것을 그리기 시작하면 사실은 16 x 4바이트 64바이트가 되어야죠.
그럼 64바이트면 16바이트의 4배. 아니야.. 내가 8바이트랬지? 8바이트에 비해 8배가 높은 것이기 때문에 압축률이 1:8로 되는 거예요.
그리고 지금 이렇게 말씀드린 압축.. 압축 공식을 말씀드렸잖아요. 뭐..
중간에 인덱스가 이렇게 들어가고 최대값, 최소값이 있다.
그러면 이것을 압축을 풀때도 굉장히 빠르게 압축을 풀 수가 있어요.
각 픽셀마다 인덱스 값을 보고~ 최대값, 최소값 중간에서 인덱스에 따라 몇% 블랜딩만 하면 되는지 나오니까
그 블랜딩에 그냥 %로 곱하면 되는거죠.
그래서 이것은 다 하드웨어적으로 지원했고 DirectX9에선 반드시 지원을 해야 됐고~
이게 DXT1을 말씀드린 거에요. RGB 채널만 했었기 때문에 알파 채널은 기본적으로 지원이 안 돼요. 물론..
알파가 100%.. 0%.. 이걸 지원하는 방법도 있기는 한데.. 제가 실무에서 쓰는 사람을 솔직히 거의 못봤고..
그래서.. DXT1은 알파 채널이 없는 경우에서 그렇게 들어가구요.
그 다음에 이제 DXT5라는 것은 알파채널을 지원하기 위해서 비슷한 것을 하는 것 뿐인데..
아까 RGB채널에 대해서 이렇게 블랜딩을 했잖아요? 그럼 알파 채널에 대해서 그렇게 따로 블랜딩을 해서 그 크기가 두 배가 되는 게 전부라고 생각하시면 맞아요.
그럼 이제 뭐.. DXT1을 써보신 분들도 알겠지만 그런.. 퀄리티가 줄어드는 단점이 또 있거든요.
그러면.. 이제 이 퀄리티를 높이기 위해 ..
DXT5를 써가지고 RGB채널을 복원하는 그런 기법을 쓰는 사람들이 있어요. 특히 노멀맵이라던가 이런거 만들때 저희가 많이 했었고..
뭐.. 그건 알파채널을 어떻게 쓰는가에 따라 다른건데.. 그것은 굳이 설명 드리지 않을 거고..
그냥.. 궁금하신 분들은 찾아보시면 될 것 같아요.
노멀맵을 DXT5로 표현하는 법.
그러면 분명히 뭐.. 예전에 게임 회사들에서 썼던 방법들이 나올거에요. 저희도 그런 방법 썼었고..
결과적으론.. DXT1, DXT5 퀄리티는 뭐...
적당히 나쁘지 않게.. 왜냐면 실제 현재 보고있는 게임의 모든 텍스처 압축은 DXT1, DXT5라고 생각하시면 맞아요.
그러면 이것을 RGBA채널로 바꾸면 어떠냐? 당연히 품질은 좋아지죠. 제가 예전에 비디오에서 말했듯이..
오히려 텍스처 사이즈를 절반 절반으로 줄이고 그거 대신에 RGBA를 쓰면 훨씬 나아지는 경우가 많다라고 말씀을 드렸잖아요~
그래서 그건 어떻게 쓰느냐에 따라 중요한거에요. 일반적으로 나무패턴 이런 노이즈 많이 낀 텍스쳐라면 별 상관없이 압축하면 될거구요.
정말 벡터 아트라던가 이런 깔끔하게 보여야 되는 거는 RGBA채널을 써서 까지라도 무리하면서 써야되는게 맞을 수도 있구요.
근데 이게 이미 10년전 기술이거든요? DirectX11에 넘어오면서 새로운 압축포맷들이 생겼어요. 왜냐하면.. 그동안에 문제점을 봤으니까..
그리고 그만큼 알고리즘도 많이 발전이 됐고, DirectX11을 지원하는 카드들은 이 새로나온 압축기법까지 푸는 그런..
알고리즘을 자체적으로 하드웨어에서 지원을 해줘야되요.
그래서 이제 뭐.. 이름이 약간 좀 바뀌었어요. 'DXT'이렇게 부르던게 이제.. 'BC' 이렇게 바뀌었거든요?
'Block Compression' 이라고 해서
번호가 저도 지금 저도 헤깔리는데..
DXT1이 BC1으로 됐고?
DXT5가 아마 BC3일거에요. BC3.
그리고 이제.. 아까 말씀드린 그렇게.. 노멀맵 압축하는 거 있잖아요. 그런것을 또 잘 하기 위해 뭐..
BC 뭐라는 포맷이 나왔어요.
그리고 또 Grayscale.. 그러니까.. 채널 하나만 있을 때 그것을 하기 위해 또 어떤 것도 나왔고..
근데.. 특히 뭐 이것은 뭐.. 어찌보면은 굉장히 특수 용도를 위한 것 이기 때문에 필요할 때마다 찾아서 보시면 되구요.
'BC7' 알고리즘이란게 나왔어요. 솔직히 제가 가장 감동을 먹었던게 BC7인데..
BC7은 말 그대로? 그.. 아까 말씀드렸잖아요. 무슨 뭐.. DXT1에서 품질을 높이기 위해..칼라 채널의 품질을 높이기 위해..
DXT5를 써가지고 뭐 어떻게... 쉐이더에서 내부적으로 곱해가지고.. 다시 쓰기도 한다 라고?
그러면 메모리가 사용량이 두배가 되는거에요.
원래 4x4 하는데 8바이트가 들었던게..
4x4 하는데 16바이트가 드는거죠..
BC7도 용량은.. 4x4하는데 16바이트가 들어요.
한마디로 용량을 두배로 키워주고~ 근데, 이것의 장점은 RGB, RGBA 둘다 지원을 하는데..
특히, RGB에서가 뛰어나더라구요. RGB에서 실제 DXT1으로 굽던거를 BC7으로 구우면..
이게 훨씬 품질이 높아져요. 저도.. 자세한 알고리즘은 얼마전에 읽어봤는데 지금 까먹었구요.
뭐.. 여러가지 그런게 있어요. 사람이 색을 어떻게 인지하는지 판단해가지고 뭐 이런 알고리즘 돌려가지고 뭐.. 이렇게 만든다 인데..
중요한 것은 이런 압축 알고리즘에서 압축하는 시간은 얼마가 걸려도 상관이 없어요. 솔직히 OPC7는 좀 오래 걸리긴 해요..
중요한것은? 압축을 풀때 정해진 수학 공식에 따라 하드웨어 wire된 걸로 곧바로 막 풀 수 있다면! 문제가 없는게 이 압축방식이거든요?
그래서 BC7은 그런식으로 해서 최대색상 최소색상 뽑기 시작할 때 부터 굉장히 복잡한 계산을 거쳐서 뽑는 것도 있고~
그만큼 또.. 두배로 메모리를 많이 먹기 때문에 품질을 좀 더 강화할 수 있는 것도 있죠. 그런데~
저도...
작년인가? 제작년에 리서치 할 때 BC7을 한번 써봤고~
최근에 이제..
어떤 PS4 게임 만들어주느라고 컨트렉터 일로~ 그때도 BC7을 써봤는데.. 칼라쪽에 BC7이 들어가면..
원본하고 거의 비교가 안 될 정도로 좋게 나오더라구요. 물론 뭐 비교해보고 노이즈 차이 뽑아내고 Diff 뽑아보면 보이는데..
이정도로 칼라채널이 좋게 압축이 될 수 있구나.. 내가 ..
그냥 육안으로 봤을 때.. '퀄리티가 줄어들었다?' 이 개념을 느낄 수 없을 정도로 칼라 채널이 압축이 너무 잘 됐어요.
그래서 보면서 참 감동을 먹었고.. 참 괜찮은 압축 방식이라고 생각을 했어요. 그래서..
앞으로 DXT.. 아니야 DirectX11 쓰실 분 있으면 메모리에 조금 여유가 있다면 BC7을 그냥 Default로 쓰라고 강요? 강요가 아니지.. 권고해드리고 싶고..
만약에 메모리가 나중에 딸려가지고 줄이고 싶은데.. 특정 텍스쳐만 좀 좋게 퀄리티를 만들 필요가 있다..
그런 텍스쳐들 있잖아요 아까 말했던 벡터 아트라던가.. 그런거는 BC7을 써보세요.
굉장히 좋아요.
BC7이 좋다고 말씀드렸으니까.. 한가지 드리고 싶은 말은..
저도 이 실수를 했는데.. BC7.. 그러니까.. 알파채널이 들어간.. transparency..
투명도가 들어간 텍스처에 BC7을 쓰면은 그 투명값이 블랜딩 되는.. 그.. 뭐라그러죠?
퀄리티! 품질이.. DXT5 그러니까 BC3죠? 지금은?
그것보다 훨씬 못하더라구요.
그래서 '알파채널이 들어간거에서는 당연히 BC7이 퀄리티가 좋겠구나~' 라고 쓰시는 것은 별로 안 좋은 것 같아요.
오히려 그것보다는 그냥.. BC3를 쓰시고! BC3가 마음에 안드신다면..
칼라채널은 BC7으로 압축하고 알파채널은 아까 말씀드린.. Grayscale Only 압축하는 방식도 있다고 그랬잖아요. 그걸로 해도 상관이 없을 것 같기는 해요.
그런데~ 그러면 메모리가.. 예전에 DXT5 쓰던 것에 비해 1.5배가 커지긴 하겠죠.
근데 뭐.. 요즘.. 컴퓨터 메모리도 커지고.. 텍스쳐 크기는 점점 문제가 없어지지 않나.. GPU 메모리가 점점 커지기 때문에.. 그생각이 들고..
그리고....
컴퓨터 성능이 이제 더 이상 발전을 덜 하잖아요.
그 상황에서 메모리만 커지는게 맞는 것 같은데..
그리고 뭐.. 아트를 더 이상 그렇게 엄청나게 집어 넣을 수 있는 그런 인건비를 우리가 낼 수 있는 환경도 아니고..
게임 회사들이.. 그래서 결과적으로는..
오히려 그런.. 남는 잉여 리소스.. 컴퓨터 리소스에 오히려.. 그런식으로 해서 품질을 그냥..
용량 많이 잡으면서 높일 수 있는 그런..
시대가 점점 오지 않나 싶어요.. 그래서..
뭐 제가.. 그동안 BC7 뭐.. BC5 이런 이야기를 거의 안했기 때문에..
일단.. 모르시는 분들은 기초 지식으로 알아두시라고 말씀을 드린거고~
그리고.. BC7하면서 제가 느꼈던 것들? 알파채널 들어가면 거의 안쓰는게 좋겠다 이정도 말씀 드렸고..
우리꺼..한가지! 하나 빼먹었구나! 그..
DXT라던가 BC7의 압축 알고리즘은 언제나 용량이 정해져 있어요. 그러니까 ..
텍스쳐 크기가 몇 by 몇이다 그러면 각 블럭마다
압축이 몇%가 되는지가 언제나 정해진 알고리즘이기 때문에..
이건 뭐.. JPEG이나 PNG 처럼.. 뭐.. 똑같은 크기의 이미지여도~ 이런 이미지면 20K.. 저런 이미지면 40K..
이런건 없어요.
그래서 어떤 의미에서는..
계산이 편해지는 것도 있죠. 그 이미지 부분만 딱 읽어오고 싶으면 글로 가서 거기만 읽어오면 되요. 굳이 뭐 처음부터 압축 풀 필요도 없고.. 그래서 뭐..
그 정도면 제가 말씀드리고 싶은 건 다 말씀 드린 것 같고.. 말하고 싶은 건 다 말한 것 같고?.. 아 몰라~!
예~ 포프였습니다~^^