|
수업 내용 정리해보기
셰이더란 무엇인가?
==
유니티에서 셰이더.
맥스, 언리얼에서는 머티리얼이라고 부릅니다!
(그래서 언리얼에서는 머티리얼을 짤 때 셰이더도 같이 짜야한다...)
셰이더는 특정한 엔진에만 국한되어있지 않습니다.
따라서
" 셰이더를 다이렉트X 기반으로 배우더라도 유니티라는 툴에서도 셰이더를 사용할 수 있다! "
즉, 핵심적인 개념을 공부하는 것이 중요합니다.
핵심을 제대로 공부해두면 심지어 미래에 게임 업계 판도가 바뀌어서 유니티나 언리얼 등의 엔진이 사장되고
신규 엔진이 대세로 뜨게 되더라도
그런 새로운 엔진에서도 무리 없이 셰이더를 사용할 수 있는 것입니다!!
==
그래서 ▶셰이더는 무엇인가?
셰이더가 무엇인지 이해하려면 먼저 GPU가 무엇이고 무슨 일을 하는지를 알아야합니다!
▶그럼 GPU는 뭔데!!?
GPU는 Graphics Process Unit의 줄임말입니다.
'그래픽스' '프로세스' '유닛'
영어가 나왔다... 따라서 어렵다는 결론이 나와버립니다(?).
하지만 괜찮습니다!
앞에서부터 하나씩 알아보면 됩니다!
먼저 " 그래픽스 "
그래픽스는 화면 상에 그래픽을 나타내기 위한 프로그램입니다!!
(※ 컴퓨터 그래픽과 컴퓨터 그래픽스는 달라요!)
(사진을 예로 들면 사진에 찍히는 피사체가 그래픽이고 사진을 찍기 위한 도구인 카메라가 그래픽스입니다.)
그다음은 " 프로세스 "
무언가를 진행하는 과정이라는 뜻입니다!
마지막으로 " 유닛 "
무언가를 하는 녀석이라는 단위입니다!
따라서 GPU는...
'화면상에 그래픽을 나타내는 진행 과정 연산을 처리해주는 녀석'이죠!!
(정말 대단하군!)
그럼 이제 GPU가 누구인지 알아보고 살짝 친숙해진 김에
GPU가 어디 사는 친구인지 장점은 무엇인지도 한번 알아보도록 합시다!
GPU는 주로 그래픽 카드(하드웨어)의 핵심부에 붙어있습니다.
컴퓨터의 마더보드에 CPU가 붙어있는 거랑 비슷합니다!
이 친구의 강점은 바로...두ㅜ구두구두구두구두구두구ㅜ
소숫점 이하의 연산 처리를 빠르게 진행해준다는 것이죠!
그래서 주로 CPU가 GPU에게 그림이나 글자 같은 그래픽 리소스를
화면 상에 픽셀 별로 출력해주는 역할을 맡아줍니다!
(원래는 GPU가 그저 CPU의 연산을 보조하는 기능만 하다가 하드웨어가 좋아지면서 3D 그래픽을 표현하기 위해 점점 더 발전하고 폴리곤의 형태를 변형시키거나, 라이팅 효과를 표현할 수 있게 되고 트랜지스터 개수가 점점 늘어나 고성능화 되었다는 역사가 있지만 이건 다음에...)
(그 . . 래 서 요 . . . ? 셰이더는 . . . 대체 무엇인가요?)
셰이더 정의를 어떻게 해야 가장 간결하게 설명할지 찾던 중에 교수님의 과거 댓글을 찾아내고야 말았습니다...!!
(절대로.. 제가 설명하기 귀찮은 것이 아닙니다... 교수님의 댓글이 너무나 완벽하기 때문입니다...(회피))
셰이더는 바로...
▶'GPU에 명령을 내려서 그래픽 카드를 통해 출력되는 모든 픽셀의 함수'를 '제어'하는 것입니다!
자신이 원하는대로 버텍스를 조작하여 픽셀을 화면 상에 출력시킬 수 있는 것이죠.....!! (정말 재밌습니다!)
테셀레이션이나, 강렬한 빛을 2D 프레임에 투영하면 실제 빛의 범위보다 훨씬 퍼져보이는 블룸,
버텍스/프래그먼트 셰이더 등을 사용해 표현할 수 있는 블러 등의 포스트 이펙트도
결국 전부 다 셰이더의 영역 안에 있는 것입니다!!!
오오ㅡ찬양합시다 대마왕 교수님을ㅡ
==
▶그래픽 아티스트도 셰이더를 간단하게 만질 수 있게 해달라!!
라는 수많은 아티스트분들의 요청에 따라...
아티스트에게 친근하고 줄줄이 코드보다 훨씬 간단해보이는... 그림! 도형! 줄 잇기!
보다 직관적인 형태로 셰이더를 다룰 수 있게 해주는 툴이
여러 가지 툴이 나왔어요!
(위: 유니티 Shader Forge▶)
(아래: 언리얼 머티리얼 노드▶)
등)
셰이더는 어렵다.
▶셰이더는 왜 어렵지?
셰이더는 수학덩어리입니다. 수학은 범위도 넓고 정말 어렵죠.
과연... 그럴까요?
사실 셰이더가 어려운 진짜 이유는..
가르치는 사람이 어렵게 가르쳐서 배우는 사람이 어렵게 배우기 때문입니다!!!
수학도 코딩도 쉽게 가르치고 쉽게 배우면 정말 쉽습니다...!!
(이렇게 소리쳤지만 아무도 믿지 않았다..)
▶그럼 무엇부터 어떻게 배워야 하는가?
완전 기초부터! 쉽고! 간단하게!
▶디지털 텍스쳐 포맷 이론
==
디지털 텍스쳐 포맷 이론
그래픽 작업 중이나 관련 공부 중에 '(R5 G6 B5) 컬러'나 'True Color'등의 단어를 보신 적이 있으신가요?
얘네들은 전부 컬러 등의 데이터가 담길 수 있는 메모리 공간의 크기. 바로 '비트'와 관련이 있는 것입니다...!
좋아요.. 아주 좋군요! 우선 비트가 무엇인지부터 알아봅시다!
비트는 바로... '데이터'를 나타내는 최소 단위입니다!
데이터란 무언가에 대한 정보를 담을 수 있는 상자 같은 것이죠...!!
컴퓨터는 0과 1 밖에 몰라서 모든 연산을 0과 1로만 처리합니다.
따라서 1개의 비트는 2가지의 상태(0, 1)을 나타낼 수 있으며,
비트가 늘어날수록 표현할 수 있는 상태의 개수가 기하급수적으로 늘어납니다...!!
0과 1. 두 개의 데이터 공간으로 색을 표현하려면 어떤 식으로 해야할까요!
(2^1승 1bit Color (ex. 0 : 검정/1 : 하양))
두 개의 색으로만 화면의 픽셀에 컬러를 부여하여 표현할 수 있습니다.
(단, 그저 숫자에 불과한 0과 1에는 컬러 정보가 들어있지는 않습니다.)
1bit 컬러에서는 주로 검은색과 하얀색을 사용하는 걸 많이 볼 수 있는데,
1비트의 데이터로 표현할 수 있는 최대 컬러 개수는 두 가지로 한정되어 있으니
보다 가장 큰 대비를 갖고 있는 색 두 가지를 주로 사용하는 것이겠죠!!
검은색 / 초록색으로도 자주 쓰였더라구요~~!!
(여기서 초록색이면 눈에 좋다는 속설이 적용되..고...?)
(▲ 1비트 컬러가 게임에 사용된 예)
==
이후 하드웨어가 좀 더 발전하여 4비트 컬러도 표현할 수 있게 되었습니다!
메모리 공간은...
0000
0001
0010
0100
1000..... 허ㅓ억..허억...ㄷ
.
.
.
1111까지 16개의 메모리 공간 사용 가능!!!
따라서 16개의 컬러를 담을 수 있는 것입니다!!!!1
==
다음은 8비트!!
00000000 00000001. . . ~ 11111111까지
256개의 메모리 공간!!
256개의 컬러!!!
256색 표현가능!!! 2^8승!!
하지만 0과 1에는 색의 번호만 있고 컬러 정보는 없어요.
컬러 정보는 다른 곳에 있는데요....!!! 그건 바로.. ... ....두ㅜ구두구두구두구
"팔레트(Palette)"
바로 이곳에... 인덱스(컬러마다 번호가 붙어있음) 컬러 정보가 담겨있는 것입니다...!!
(아티스트가 팔레트 컬러를 지정해둔 경우 타 파트 사람들이 마음대로 잘못건드리면 인생이 힘들어진다...)
(특정한 번호가 매겨진 그 컬러가 사용된 모든 버텍스의 색이 바뀌어버리기 때문.)
디더링이 진행되면서 팔레트를 추출할 수 있습니다!
근데 디더링이. . . 뭐지 ?
디더링이란 바로 색 병치 혼합!!
비슷한 컬러 정보를 가진 버텍스끼리 서로 근처에 찍어서 자연스럽게 보이게 하는 그래픽적 기법입니다.
▲ 종류가 정말 많네요 ^~^
아래는 팔레트 사용 실습!
포토샵 Image-Mode-Indexed Color 메뉴로 들어가서
▲ RGB 색상(R) 대신 인덱스 색상(I)로 적용시킨다!
(우리딸 샤니가 이쁘니까 다들 보세요)
▲ 원하는 팔레트 컬러 개수와 디더링 옵션을 설정한다
(사심이 가득 담긴 크롭)
▲ 옵션 잘못 선택했을 때 나노팁
(알트를 누르면 리셋 버튼이 나온다)
▲ 뽑아버렸다... 너의 ˝팔레트˝
( 8비트 컬러이므로 2^8개 )
▲ 바뀌어버렸어... 너의.. '팔레트 컬러'
==
팔레트 애니메이션
(▲ 정말... 대단하고 멋지다..)
이런 식으로 팔레트의 컬러를 임의로 바꿔서 물체가 움직이는 것처럼 보이게 하는 기법도 있습니다!
(게임에서의 사용 예로는, 블리자드의 갓ㅡ게임 '스타크래프트'의 애니메이션 대부분에 사용되었다.)
단 2개의 컬러만 사용할 수 있던 1비트(2^1bit)에서 8비트(2^8bit)로 용량이 8배 증가한 반면에!!
사용 가능한 컬러 개수는 128배나 증가했습니다!!
2^n승으로 기하급수적으로 증가하기 때문에 하드웨어가 발전할수록 점점 남는 장사가 됩니다!
==
16비트로 갑니다!
2의 16승.... 65536이죠!!
플머들은 숫자를 0부터 세므로 0 ~ 65535까지 색을 표현할 수 있습니다!!!
하드웨어가 더 발전하였기 때문에....
드뎌... 빛의 삼원색인 RGB를 사용해서 컬러를 표현할 수 있게 되었습니다!
사실은 예전부터 RGB라는 게 컴퓨터에 존재하긴 했지만..
하드웨어가 구려서 사용할 수 없었던 것입니다.(팩.폭. 작렬)
여기서 잠깐 퀴즈~~!!
-
빨강초록파랑빛 합치면 흰색!!
3개의 픽셀이 뭉쳐서...하나로 보인다!
RGB 다 끄면 검은색!! R만 있으면 빨간색!!
R, G만 켜지면 무슨 색?? 노란색!!!
RGB 절반만 켜지면? 회색!!!!!!
-
색의 강도를 조절하면.... 컬러를 "컨.트.롤."할 수 있습니다!!!!! 정말 멋진 일이죠.
R/G/B 각각에 데이터를 골고루 나누어주기 위해,
하나당 숫자 16개 분량의 비트 (ex. 0000000000000000)를 3개로 나눕니다!
근데.. 5/5/5로...나누면.. 15개군요...?
사람의 망막에 있는 시세포 중 원추세포가 인식할 수 있는 가시광선의 파장 중 옐로 ~ 그린 계열의 파장이 비교적 긴 편이며, 사람의 눈은 초록색을 더 민감하게 반응하여 인식하기 때문에 그린에 1개를 더 줍시다!
▶ ( 5bit 6bit 5bit ) Color가 되었습니다!!!
5bit는 2^5이므로 32!!
따라서 Red는 32개의 단계로 깜빡일 수 있죠!!
그린은 6bit이므로... 64!! 5bit보다 두 배가 증가한다! 제곱은 정말 좋군요...!!
이전보다 훨씬 더 다채로운 컬러 표현이 가능해졌습니다.
32*64*32곱하면 65536개의 경우의 수!
(R5 G6 B5) ▶ 5+6+5는 16이므로 2를 16승 해주면 65536!!
16비트 칼라!!!
[4:4:4:4로 사용할 수도 있지만, 한 가지 색이 16단계로 밖에 못 깜박이므로 색의 다양함이 줄어듭니다.]
▶65536개라는 어마어마한 수의 컬러를 표현할 수 있는 것이죠!!
RGB를 사용하므로 팔레트는 버립니다!(과감하군!)
((하지만.. 아직은 그라데이션을 그리면 사람 눈에는 줄무늬가 보입니다. 그래도 훨씬 나아졌군요!))
게임에서 주로 쓰는 텍스쳐도 16비트 칼라입니다!
==
다음은... 32비트가 아니라 24비트!!!
한 픽셀에 000000000000000000000000 !! 숫자가 24개나 들어갑니다!!!!
2의... 24승!!! 1600만 칼라! 16,777,216 칼라! 트루 칼라라고 부르죠!
3개로 나누면.. 한 채널당 8 8 8 칼라로 나눌 수 있구요! (R8 G8 B8)
▶ 레드 그린 블루가 각각 256단계로 반짝이므로!!
256는 2^8..따라서 (255 255 255)가 하얀색입니다...!!
이것은 바로... TGA (알파 없는 것) 포맷입니다!!!
여기다가 32비트를 주면...!!
각각 256단계로 반짝이는 RGB와.. 알파채널!
32비트는 (2^8 * 2^8 * 2^8 * 2^8 ) == (256*256*256*256)
▶ 4,294,967,296
경우의 수가.. 42억개! 정말 어마어마합니다.
채널당 8비트씩 분배할 수 있죠! (R8 G8 B8 A8)
포토샵에서 알파채널처럼 R/G/B채널만 각각 켜면 흰색과 검은색으로 보입니다!
흰색이 가장 높은 강도, 검은색이 가장 낮은 강도로 표현!
==
채널당 16비트이면...
한 채널이 16비트이면 (16R 16G 16B 16A)
한 채널이 32비트이면 (32R 32G 32B 32A)
▶이것은.. EXR이나 TIFF 파일 포맷!!!
(채널당 16비트/32비트 지원 가능한 초고화질 기법)
(HDR 파일도 이런 식으로 정밀하게 구성되어 있습니다!!!)
(ex. 16비트/32비트는 HDR, 라이트맵, 터레인 높낮이를 표현해둔 하이트맵 등에 사용합니다!)
==
FLOAT(부동소숫점)
크기가... 32비트! 즉 4바이트! (8비트에 1바이트)
소숫점이 있는 수! 실수라고도 합니다!
(5R 6G 5B) 컬러에서는 (2^5 2^6 2^5)==(32 64 32)이므로
32 64 32가 하얀색!!
(8R 8G 8B) 컬러에서는 (2^8 2^8 2^8)==(255 255 255)이므로
255 255 255가 하얀색!!!
(aR bG cB) 컬러에서는 (2^a 2^b 2^c)==(x y z)이므로
제일 끝에 있는 게 하얀색!!!!!
하얀색의 기준이 모두... 달라져버립니다.
이렇게되면 골치 아파지는 플머들은 그래픽 파트쪽에서
텍스쳐를 565컬러 포맷으로 줄지 888컬러 포맷으로 줄지 다른 어떤 걸로 줄지 모르므로
어떤 포맷으로 받든 적용시키기 위해 퍼센테이지로 표현하면 편하죠!!
(100% 100% 100%) (1.0이 100%, 0.0이 0%이다)
이것을 float로 표현해야하므로 Float3(1.0, 1.0, 1.0)
Float3(0.5, 0.5, 0.5)는 회색....!!!
포토샵에선 각 채널을 255로 나누면 변환할 수 있습니다!! (ex. 255/255 = 1)
"숫자를 색깔로 나타낸다!!!"라는 개념. 정말 중요합니다.
여담
float는 너무 크니까 절반정도 크기인 하프나 픽스드를 자주 쓴다!
half는.. float의 절반 정도 크기...! 16비트!
fixed는 훨씬 더 작다! 11비트!
RGB는 xyz축과 같다!!
따라서 컬러는 좌표로 나타낼 수 있다!!!!
노말맵이 거의다 파랗게 보이는 이유는 RGB에서 z값이 높기 때문이다!!!
==
HDR ( High Dynamic Range )
HDR이 뭘까요~~!!???
일단 영어니까.. 단어를 하나씩 살펴봅시다...!!
일단 첫번째로... ! 하이("High")..!! 정말 반가워요~!(하이~!?) 아니.. "높다"는 뜻이죠!
그다음은... 다이나믹("Dynamic")...! 이건 헷갈릴 수 있는데..
바로 동적인! 역동적인! 이라는 뜻입니다~~!!
레인지("Range")! 이건...
최대/최소치가 정해진 특정한 범위를 나타내는 말이죠!
HDR은 HDRR 또는 HDRL이라고도 하는데 너무 길어서
보통은 뒤의 렌더링이나 라이팅을 빼고 말합니다.
따라서... HDR(R/L)은 바로!
"어둡거나 밝은 부분이 (다른 모니터보다 상대적으로) 넓은 범위로 렌더링되는 녀석"이라는 뜻!!
'동적명암비'라고도 하구요~
"빛을 어디부터 어디까지! 어두운 부분부터 밝은 부분까지 다채롭게 표현할 수 있는가!"가 바로 동적 명암비이죠...!!
보통은 채널당 10비트 이상이면 HDR 모니터로 인정받습니다...!
2^10승이니까... 한 채널당 1024단계나 되는군요..!!
최근에는 오른쪽 이미지처럼 채널당 12비트나 되는 매우 높은 동적 명암비를 가진 TV도 나오는 추세입니다!
예전에는 비교적 낮은 명암비를 가진 모니터만 나와서 생생한 빛을 표현하기 힘들었는데 HDR 모니터가 나온 이후로 표현할 수 있게 된 것입니다!
'블룸'이라는 건 사실 채널당 8비트의 제한된 명암비 안에서 실생활의 눈부신 빛 같은 걸 표현하려는 기법이었는데
HDR 모니터가 나오면서 블룸의 기준이 달라져버리는 것입니다.....!!!!
넓은 명암비를 통해 곧바로 표현할 수 있게 된 것이죠!
오른쪽 사진을 보시면 High Dynamic Range부분에 More than 1000 nits...?라고 나와있습니다!
닛츠! 가로세로 1m²크기 공간에 촛불 하나가 켜져있는 밝기를 뜻하는 단위가 바로 1닛츠인데요...!!
한 평 정도 되는 공간에 촛불이 약 3.3개 정도 켜져있는 것입니다!
1000 nits면 어마어마하게 밝겠군요!
하이가 있다면 로우도 있겠죠?
바로.. TGA 파일 포맷 형식 같은 888 컬러를
LDR(Low Dynamic Range)/혹은 SDR(Small Dynamic Range)라고 합니다..!!
채널당 8비트 컬러가 우리가 생각하기에는 뭔가 높아보이긴 하는데,
256개의 단계로는 실제 실생활에서 경험할 수 있는 컬러를 전부 표현하긴 어렵습니다!
예를 들면.. "한여름의 내리쬐는 밝은 태양빛" 같은 걸 888컬러로 표현하려고 하면 컬러를 표현할 수 있는 단계가 적어서
우리 생각보다 상당히 밍밍하게 나오는 것이죠...!!
보통 예전에 쓰던 CRT 모니터! '브라운관 모니터'라고도 합니다.
얘가 보통 채널당 8비트 컬러로 화면을 표현하는데요!
얘는 작동 원리를 따라서 ("Cathode Ray Tube" - 음극선 관...!!) (캐↗쏘→드ㅁ...레이 튜.. 브. ?. ?) 이름 붙여졌습니다!
독일의 물리학자 브라운 아저씨가 실험해서 음극선관을 만들어서! 바로 그 이름이 붙여진 것이죠...!!
(과학자들은 원래 자기 이름 붙이는 걸 정말 좋아합니다!)
왼쪽 그림을 보시면... RGB가 보이는군요!!
과학 시간이 아니니까 대강 설명하자면...
전자총으로 캐소드-레이(음극선)!
"음극에서부터 나오는 RGB 컬러의 전자 3개를 관을 향해 쏴서!
전자를 굴절시켜 화면 상에 표현하는 방식"이라는 뜻이죠..!!
아무튼 각설하고 LCD 모니터는 발색이 약간 푸르딩딩하고... 날카로운 느낌이 들어서.. CRT 모니터의 음극선이 표현해주는 누리끼리하고 따뜻하고 은은한 아날로그적인 발색 때문에
완전히 LCD모니터가 정착되기 전까지는 CRT 모니터를 메인으로, LCD모니터는 서브로 같이 쓰기도 했습니다!
하지만... 게임 유저들이 모두 LCD 모니터로 갈아타면서 CRT 모니터는 완전히 갈아치워졌습니다...!!
(눙ㅇ..ㅁ루... 안녕... 잘ㄹ가.. CRT~모니터T.T휴.ㅜ..ㅠㅠㅠ)
모든 모니터가 HDR 모니터로 바뀌게 되면 현재의 LCD모니터도 사라지겠죠..? ㅎ,ㅎ! 정말 기대되는군요!
==
게임 전용 텍스쳐 포맷
3D 오브젝트를 매핑하기 위해서는 2D 텍스처가 필요합니다...!
게임에 주로 사용되는 텍스쳐 포맷은 무엇일까요?
TGA.. ? DDS...? 아니면.. PNG. . . ?
아직까지는 잘 감이 잡히질 않으시죠...!!
이것을 이해하려면 먼저 그래픽 API부터 알아보아야 하는데요!
다같이 한번 알아보도록 하죠!
최근에 주로 사용되는 그래픽 API의 양대산맥은 바로..
" DirectX ", " OpenGL "
" OpenGL " 같은 경우는 광활한 호환성을 중시하기 때문에
거의 모든 기기에서 다 돌아가서 무척 많이 쓰는 API입니다!
심지어 오픈소스죠! 조금씩 수정해서 쓰거나 판매할 수도 있습니다!
우선, 그래픽 API의 역사부터 잠깐 알아봅시다...!!
과거! MS-DOS 운영체제 기반 게임이 한창 인기를 끌고 있던 시절.
MS가 만들어서 윈도우 운영체제에 지원하던 " GDI "라는 API가 사용되고 있었는데요...!!
이 친구는 주로 2D 벡터 그래픽과 이미지, 글자를 출력하는 데에 썼습니다.
하지만.. 그래픽 처리 성능이 쫌 많이 구렸습니다...
너무나도 구렸던 것입니다....
'윈도우에서는 할 게임이 없다'라는 말이 나올 정도로 구렸던 것이죠...
그래서 MS는 '지뢰찾기'나 '카드놀이'처럼
실시간 그래픽 동기화 처리가 느려도 크게 지장은 없는 게임만
기본 구성으로 넣어둔 것입니다....!! (근데...하다 보면 재미따...! 기획자 짱!)
( 다 이유가 있는 것이었습니다! )
게임을 개발할 때에도..
그래픽 카드의 그래픽 결과물을 출력하는 API가 통일되어있지 않아서
그래픽 카드마다 각각 따로 개발을 해줘야만 했습니다...
(허ㅓ억...ㄱ무척 개고생이다..)
이때까지만 해도 규격이 통일되어있지 않아서 다들 OpenGL과 iMac PC를 선호하곤 했죠!
그러던 중에 MS가 이런 광경(뭐라고.. 맥을 쓴다고?)을 미처 보고만 있을 수 없어 다이렉트 X를 만들어냈습니다!
(전신으로 WinG라는 녀석이 있는데 얘는.. 성능도 쫌 구리고 도스게임이 이미 많이 나와있어서...)
(많은 관심을 받진 못 했죠..)
MS : "야ㅏ API 전부 통일해ㅡ(완젼 깡패)"
MS : "글구 너네 그래픽카드에서 다이렉트엑스 지원해~~!!~(빼ㅐ액ㄱ~~!!!)"
그렇게 MS의 독촉에 따라 AMD나 nVIDIA같은 유명한 하드웨어 회사들을 포함해서
대부분의 회사들이 다이렉트 X를 지원하는 그래픽 카드를 만들게 되었습니다!
결과적으로 통일된 업계 표준 규격이 생겨서 좋은 일이긴 해요~~!
간단 역사 이야기 끝!!
==
다시 한 번 질문해봅시다!
게임에 주로 사용되는 텍스쳐 포맷은 무엇일까요?
일단... 널리 사용되는 그래픽 파일 포맷에 대해 한번 살펴봅시다!
==
DDS( DirectDraw Surface ) 포맷
DDS는 우리에게 조금 생소할 수도 있는데요!
MS에서 만들었고, Direct X 7.0과 함께 등장한 파일 포맷입니다!
과거의 업계 표준 포맷이었으니 지금의 TGA랑 비슷한 포지션이라고 생각하면 되겠군요!
( 지금도 DDS를 사용하지 않는 건 아니지만요! )
DDS 포맷의 특징은 무엇일까요!
분명 굉장히 좋은 장점이 있으니까 썼을 것입니다!
여러 가지가 있는데요~! 하나씩 알아봅시다!
1. 그래픽 카드가 다이렉트X를 지원한다면, 1:1로 대응되어 압축을 풀지도 않고
DDS 변환도 없이(이미 DDS인데 뭣하러 또 DDS로 변환하리오~~!)
" 매우 빠르게 출력됩니다 ! "
2. 손실 압축방식이라서 용량이 적은 편이라서 메모리를 최적화하기 편하기도 하구요~!
(단, 2*2, 4*4처럼 짝수(2의 배수)로 압축되는 방식이 사이즈가 2의 승수만 가능합니다.)
3. Direct X를 지원하는 그래픽 카드에서 하드웨어 가속 기능을 지원하기 때문에
그래픽 리소스가 더욱 빠르게 출력됩니다!
4. 밉맵을 만들 때 각 레벨별 서피스를 파일 하나에 저장할 수 있습니다!
하지만 단점도 있는데요!!
1. 미리보기가 안 돼서 웬만하면 바로바로 못 본다...
2. 포토샵에서 바로 쓸 수 없고 플러그인을 설치해야다!
(근데 이건 걍 플러그인을 깔면 해결되는 문제이긴 합니다!)
장점이 훨씬 많군요?
이 정도면 충분히 사용할 수 있겠죠!?
PNG나 JPG 등의 다른 포맷 파일을 게임에 넣어도 다이렉트 X 때문에 자동으로 DDS로 변하게 만들어져있어요!
이렇게 자체 압축되면서 그래픽 리소스가
"한 번은 꼭 깨지기 때문에"
최대한 우리 게임에 맞는 적절하고 좋은 파일 포맷을 써야합니다!
일단 최적화를 위해 용량도... 적당해야하고!@~ 압축 포맷인지 무압축 포맷인지!
손실 포맷인지 비손실 포맷인지도 고려해야 합니다!
여러 가지를 따져보면...!!
현재는 TGA가 가장 적당한 파일 포맷으로 알려져 있습니다! - 무압축 용량적당
실제로 현업 표준 파일 포맷으로 사용되고 있구요~~!
(그렇다고 해서 모든 곳에서 TGA만 사용하는 것은 아닙니다...!)
UI 파트에서는 미묘한 그라데이션을 살리기 위해 용량이 크지만 비손실 압축포맷인 PNG 등을 그대로 씁니다!
(단, 최적화를 위해 파일 개수를 줄여요~)
==
●데스크탑 텍스쳐 포맷!
( 실제로 졸작에 쓸 수 있는 포맷!! 참고합시다~~!! )
( ※ 주의 : 알파가 있으면 용량이 2배!~~ )
게임을 만들 때는 TGA를 그냥 쓰지는 않고 TGA랑 똑같은 압축 형식을 가진 파일 포맷을 사용합니다!
포토샵에서 dds 포맷 파일을 만드는 법은 !
바로 아래 링크에서 포토샵 플러그인을 다운받으신 다음에
"다른 이름으로 저장(A)"을 누르시면 아래와 같은 창이 뜹니다!
https://developer.nvidia.com/nvidia-texture-tools-adobe-photoshop
DDS 플러그인을 통해서 밉맵도 만드실 수 있구요~~!
▶ 보통은 TGA( 32bit )랑 같은 결과물인 DXTn 포맷들을 주로 사용하구요!
▶ 알파만 있는 8비트 형식도 가끔씩 사용합니다!
● iOS 텍스쳐 포맷은 PVRTC라는 이름으로 사용되고, 데스크탑 포맷과 이름은 다르지만 비트수는 비슷합니다!
● 하지만 안드로이드가 문제죠....!!
안드로이드 기반으로 하드웨어를 만드는 회사가 다 달라서 기기별로 칩셋이 다 다르고 속도도 다르고
버그도 다르고 셰이더가 안 돌아가기도 하고 생기는 버그도 다릅니다(제일 중요)~~
그나마 공통적으로 사용할 수 있는 파일 포맷은 바로
RGB Compressed ETC 4 bits ! ! !
하지만 얘는... 알파가없ㅇ어요!!!!!@@!!@
그래서... .그냥.. 용량이 어마어마한....RGBA 16bit 포맷을 씁니다..
근데..파일 포맷 자체에 논리적인 오류가 있어서...드럽게 깨집니다...
==
안드로이드 텍스쳐 파일 포맷을 유니티에서 확인해보자!
주로 사용되는 포맷은.. ETC 포맷입니다!
예전에 ETC1만 사용했을 때에는.. 비트수가 적어서 컬러가 많이 깨졌습니다.
하지만 최근에 ETC2가 나와서 드디어 알파가 들어가고 성능도 좋아졌습니다!!!
( 단, 사용 조건으로는 오픈지엘 3.0이상이어야 하고 )
( 하드웨어적 성능은 갤럭시 노트3 이상이어야 해요!!@)
알파가 있으면 RGB마크! 밉맵이 있으면 밉맵 레인지 마크!
※ 주의 : 언랩한 파일을 알파에 집어넣고 쓰면 안 된다는 것!
RGBA Compressed ETC2 8 bits군요!
여기서 알파를 빼버리면 용량이 어느 정도로 줄어들까요?
알파가 사라지면 RGBA가 한 채널당 8bit씩 4개로 같기 때문에 용량을 4로 나눠서 다시 3을 곱해주면
최종적으로 줄어드는 용량을 예측할 수 있습니다!
이런 식으로 용량을 계산해서 최적화하는 것이죠...!
알파가 없을 때 압축시키면 ETC1 RGB로 압축됐었습니다!!
하지만 깨집니다... 그것도 2*2 단위로 색을 깨버립니다!!
( ▲ 클릭하시면 커져요 )
(그래서 사이즈가 2의 배수여야 해요 ((중요)) )
현재는 ETC2가 나와서 괜찮지만요!
==
셰이더의 시초
셰이더의 시초는 애니메이션 스튜디오의 "Pixar"의 "RenderMan"이라는 게 정설입니다!
CG 기술의 원천인 업계 표준 3D 렌더링 및 셰이더 기술을 만들어낸 것이죠!
셰이더는 렌더링 파이프라인의 특정한 부분을 아티스트가 조작하기 위해 만들어진 것!!
주로 단순한 반복연산을 병렬처리하는 명령을 GPU에 내려서 빠르게 처리할 수 있습니다!
그래서 이렇게나 빠른 셰이더! 정말 여러 곳에 응용할 수 있는 것이죠!
예전에는 늘상 플머만 렌더링 파이프라인을 만지다보니까..
나오는 결과물이 아티스트가 보기에 " 매.우. 구.려.서.((중요)) "
아티스트도 렌더링 파이프라인을 만질 수 있게 해달라고 요청하였고...!!
결과적으로 파이프라인 중 일부분을 '셰이더를 통해 아티스트가 제어'하기 정말 쉽게(?) 만들어주었습니다!!
( 단, 플머 기준으로 봤을 때 쉬운 거라서 문제인 것입니다.. )
==
셰이더 언어 - 표준이 달라버렷~~!!
셰이더를 짤 때 주로 사용되는 언어가 세 종류가 있는데요!
그건 바로...
다이렉트 X - HLSL/OpenGL - GLSL
Nvidia - Cg (C for Graphics)
( 근데 셋 다 문법이 매우 비슷해요! 공부하는 입장에선 매우 편하군요. )
렌더 몽키(Render Monkey) - 다이렉트 X 기반으로 HLSL을 사용하는 셰이더 개발 프로그램!
혹자는... "아티스트? 셰이더? 렌더몽키 한번 써봐~ 완젼 쉬워!!@"라고 할 것입니다...
하지만..
" 다이렉트 X가 쉽다는 사람은 천성이 코딩 변태니까 그 말을 "절대로" 믿어선 안 됩니다...!! "
( 대마왕 교수님: ?아냐ㅡ 정통.. 코딩이야.... 어려워... )
근데... 재미는 있어요.. ㅎ.ㅎ..1!!(자폭!!1@~~
유니티는 멀티 플랫폼을 지향하는 엔진이라서 호환성을 위해 약간의 자체 문법을 써서
셰이더가 돌아갈 때 각 기기마다 지원하는 다른 셰이더 언어로 변환시켜줍니다!
"ShaderLab" - 코딩까진 아니고 스크립트. 유니티의 셰이더 자체 문법
▶ 호환성이 정말 좋습니다! 돌아가지 않는 기기가 거의 없어요!
▶ (하지만 기능이 매우 구려서 이걸로만 짜면 할 수 있는 게 없다ㅡ는 짠내나는 사실이..)(눙ㅜ물ㄹ..
Surface Shader - ShaderLab 기반인데 중간만 Cg로 짜는 셰이더!
Fragment Shader - 렌더몽키 쓰듯이 하드코어하게 다 짜는 셰이더!
▶ "서피스 셰이더 ( Surface Shader )" 의 특징 !
1. 행렬 연산 없음!( 이건 축..복이다.....,,, )
2. 비주얼 셰이더 에디터( 언리얼 노드 등 )와 개념적으로 매우 비슷해요!
3. 그림자를 자동으로 연산해줍니다! ((짱이다... 갓ㅡ플머님들 감사합니다))
4. C문법 쬐끔 필요합니다! (기초문법, 변수, 함수, 조건문 정도만 알면 된다는 것!!)
※ 주의사항
1-1. 셰이더 파일 이름과 셰이더 내부의 이름이 다릅니다!
따라서 이름을 수정할 땐 신경써서 같이 바꿔주어야 해요!!
1-2. 한 쪽을 수정한다고 해서 다른 쪽이 자동으로 수정되지도 않습니다...
2-1. 프로퍼티 이름은 다 다르게 해야하고 잘 지어야합니다.
2-2. 대소문자 구분이 정말...정말 중요합니다!
글자하나만 달라져도 아예 다른 녀석으로 취급되기 때문입니다...!!
3. '.'은 앞에 오는 거 안에 있는 뒤에 것입니다!
▶ ( ' A.rgb ' 는 'A' 안에 있는 'rgb' 요소라는 뜻입니다.)
4. 등호 '=' 에는 반드시 타입이 같은 걸 넣는다!!!
5-1. Surface Shader에서는 스크립트부분이 CGPROGRAM으로 시작해서 ENDCG로 끝나요!
5-2. CGPROGRAM 안쪽 코드는 ShaderLab으로 처리되는 부분이 아니라서 코딩 표준을 지켜야합니다!
▶( 세미콜론 ' ; ' 붙이기 연산자 ' = ' 제대로 사용하기 등등.. )
5-3. CGPROGRAM으로 시작했으면 반드시 ENDCG라는 문을 닫아줘야만 합니다...!!
==
셰이더 프로퍼티 인터페이스 설정 실습!!!
3-1. 셰이더 스크립트 파일을 보관할 폴더를 하나 만들고
쓰↗탠다드 써↗피스 쎼ㅔ↗이더를 하나 만들거예요!
위에서 설명한 주의사항대로 먼저 원하는 셰이더 파일 이름을 잘 생각해서 지어줍니다!
4. 구를 클릭하고 머티리얼에서 셰이더를 찾아서 적용시켜주세요!
셰이더를 새로 만들었으니 Custom 안으로 들어가면 있답니다!
5. 가볍고 빠른 유니티 내장 스크립팅 에디터인 모노디벨롭을 선택하고
셰이더 스크립트로 들어가봅니다~~!
( 비주얼 스튜디오는 첫 실행 시 로딩이 너무 길어요~~~ )
( 비주얼 스튜디오 2017부터 중괄호끼리 연결시켜 보여주는
유용한 기능이 생기긴 했지만! 너무 느리니까 다음에~ )
( 세팅에 따라 간혹가다 변수에 불 안들어오는 경우도 있으니 주의! )
6. 스크립트는 보통 중괄호를 기준으로 각 블럭별로 기능과 구역이 나누어져 있습니다!
스탠다드 셰이더 각 부분의 설명을 읽어주시고 계속 진행할거예요~~!
7-1. 이제 프로퍼티를 수정해볼 거예요~~
프로퍼티는 바로 머티리얼에 보이는 인터페이스인데요!
자신이 넣고 싶은 텍스쳐 자리를 만들거나, 셰이더에서 조절하고 싶은 값을 추가하는 등
자신이 원하는 모습으로 인터페이스를 만드는 것입니다!
7-2. 원래 있던 코드는 엔터로 밀어놓고 먼저 새로운 거 하나를 추가합시다!!
이름은 시험삼아... ZZerrerJuNeunByunSu... 바로 쩔어주는 변수죠!
만들 타입은 바로.. Range 타입!
Range 타입의 UI를 추가하면 슬라이더가 생겨서
슬라이더 바를 조절해가며 원하는 수치를 찾을 수 있습니다!!!
본격적으로 값을 추가하고 인터페이스에 실제로 값을 연결하는 건 다음주에~~
여담
알! 베도(Albedo)는 빛의 영향을 받는다. (일단은..?)
에^! 미쎤~(Emission)은 빛의 영향을 안받는다!!!
셀프 일루미네이션은 사실 밝아지는 게 아니라 어두워지지 않는것(그림자. 음영이 안생긴다)
int는 DX11부터 제대로 지원되는 타입이라서 잘 쓰지않는다.
===============================================
여기부터는 넘기셔도 됩니다... 왜냐하면..
교수님께서 렌더링 파이프라인 질문하셨는데 멍청한 제가 까먹어서(절레절레)
수업이 끝난 이후에 복습을 한 내용이기 때문이죠!
역시 공부는 계속 해야 하고 복습은 정말 중요합니다.
(사실... 위에서 GPU 설명한 다음에 픽셀이 화면 상에 출력되는 과정을 쓰려고 위쪽에다 추가하려고 했는데)
(아직 수업 진도가.. 비트수 밖에 안 나갔으니 렌더링 파이프라인이 벌써 나오면)
(수업 스포일러일 것 같아서...)
[알파소팅 Z read Z write 관련으로도 얘기하셨는데
아마 어느 알파블렌딩(반투명) 오브젝트가 앞에 있는지 판별할 때 쓰는 알파테스팅에 관한 걸 말씀하신 것 같군요.]
자료는 제가 만들 능력이 없어 모두 어딘가에서 퍼오고 긁어오고 잘라왔으니...
양해 부탁드리며.... 외부로 유출되면 저는..(덜더럴ㄹㄷ.ㄹ덜ㄹ...,,)
●알아둘 사실!
우리가 늘상 보는 모니터는 사실 2D이고, 화면 속에서 보는 생생한 3D 그래픽 리소스도 결국 2D입니다. 어떻게 된 일일까요? 컴퓨터 모니터에 3D 홀로그램이 달려있지 않은 이상, 3D 모델을 모니터 화면에 표현되는 2D 요소로 만들어서 화면 상에 보여주어야 합니다.
라이팅 등의 기하학적 표현을 이용해 깊이감을 만들어서 실제 3D 공간 상에서 보이는 오브젝트처럼 보이게 하는 것이죠!
2D 화면 상에 3D 그래픽을 표현하기 위한 일련의 과정이 바로 '렌더링 파이프라인'입니다.
(그래픽스 파이프라인이라고도 합니다)
CPU는 먼저, 그래픽 오브젝트(주로 3D 모델)를 각각의 오브젝트가 갖고 있는 로컬 공간(Local Space) 상의 고유한 상대적 좌표에 위치시킵니다.
그다음, 위치 변환 행렬을 통해 절대적인 공간(World Space) 상의 좌표로 변환하여 위치를 옮겨줍니다.
이러한 물체의 좌표 변환(이후에는 라이팅, 투영) 부분에서 버텍스 셰이더가 힘써줍니다!
다음 단계로, 버텍스 셰이더와는 다르게(버텍스 셰이더와는 다르다 버텍스 셰이더와는!!) 버텍스의 수를 늘리거나 줄일 수 있는 지오메트리 셰이더( DX10 ~ )를 이용하여 원본 메쉬의 폴리곤을 쪼개는 등 변형시켜 삼각형의 개수를 증가시키는 테셀레이션( DX11, 헐 셰이더, 테셀레이터, 도메인 셰이더 ) 등의 과정이 진행됩니다.
(지오메트리 셰이더로는 모션 블러 등의 포스트 이펙트도 처리할 수 있습니다. 원리는 각 버텍스를 움직이는 아웃라인만큼 도형을 펼치는 방향으로 움직이게 만든 후, 속도 버퍼를 만들어 모델 위에 씌워서 잔상이 일으켜보이게 만듭니다.)
그다음엔 모니터 화면 상에 띄울 오브젝트가 위치한 가상의 공간의 범위를 지정하기 위해, 가상의 카메라를 월드 공간 속에 정의합니다. 임의의 좌표에 위치한 카메라를 통해서는 이후에 진행될 투영 등의 과정이 어려워지므로
오브젝트에 라이팅이 적용되며,
(Diffuse - Lambert, Half Lembert, Oren-Nayer Model, etc. )
(Specular - Phong, Blinn Phong, Gaussian, Beckmann, Heidrich-Seidel anisotropic,
Ward anisotropic Distribution, Cook-Torrance Model, etc.)
GPU에서 화면 상의 좌표(Viewport Space)로 버텍스를 옮겨주는 뷰포트 변환이 이루어지며,
▲ (요로코롬 괴상하게 생긴 수학덩어리 상자에 3D 모델을 넣어주면)
(뷰포트 변환이 진행된다!)
가까운 평면( near plane(앞쪽 클립) ), 먼 평면( far plane(뒤쪽 클립) ), 두 클립 사이의 거리, FOV(시야각).
총 4가지 요소를 통해 카메라 공간을 절두체로 정의하여 n차원의 물체를 n-1차원으로 보내는
'투영(Projection)'이 이루어집니다.
간단히 말하면 3차원 공간에 존재하는 3D 모델링을 2차원의 화면이 비춰질 공간으로 보내는 것입니다...!
( 뭔가... 훅훅 지나간 것 같은데? )
투영의 종류도 정말 다양합니다!!
1. 3D 게임 원근법이 적용되는 원근투영( 카메라로부터 먼 물체 멀게, 가까운 물체는 가깝게 보이게 투영 )
▲ WItcher 3
2. 절두체대신 육면체를 이용하여 앞, 뒤, 옆, 위, 아래의 모습을 주사위 전개도처럼 찍어내어 각각 똑같은 거리로 보이게 하여
2D게임 등에서 주로 사용되는 직교투영(Orthographic Projection)
▲ Cave Story
...등 그 이외에도 경사투영, 축측투영 많은 종류의 투영이 있는데
이건 다음에..언젠가는...
그다음 렌더링 파이프라인 과정으로는 바로...!!
그래픽 리소스를 표현하는데 필요한 폴리곤을 그리기 위해 컬러 정보를 담고 있는 버텍스를 모아서 삼각형으로 만들어주는 래스터화(Rasterization)가 진행됩니다. 지금까지의 과정을 거쳐온 3D 모델을 래스터라이저를 통해 2D 픽셀로 화면 상에 찍어주는 것입니다.
래스터화된 그래픽 리소스는 보간(Interpolation) 이후 '픽셀 셰이더(/프래그먼트 셰이더)'를 거쳐 결과적으로 버텍스가가 갖고 있는 컬러 정보를 통해 실제로 버텍스 컬러가 표현됩니다.
이후에는 UV맵 상의 UV좌표계를 이용하여 텍스쳐의 텍셀(텍스쳐가 적용될 범위)을 확인한 후 텍스쳐가 3D 모델에 매핑되며,
출력될 결과물이 반투명 오브젝트(알파 블렌딩)인지 아닌지 그래픽 리소스의 알파값을 확인하고, 출력할 여러 개의 그래픽 리소스의 Z값을 판단하여 투명한지 아닌지를 특정 기준을 두고 칼같이 판단하여 각각의 오브젝트의 앞뒤를 확인하기 유용한 '알파 테스팅' 등의 '렌더 백엔드' 과정이 진행됩니다!!
짜쟌! 드디어 끝~! 위와 같은 일련의 과정을 거쳐 멋진 3D 결과물이 출력됩니다!
(잘 몰라서 휙휙 지나간 부분은 분명 교수님께서 수업 중에 설명해주실 거라 믿습니다...)
=====
|
첫댓글 끝났으면 (수정중) 을 없애야 내가 보지요
방금 실습부분까지 추가했습니다~~
@201513126 정근수 예입
▲ 바뀌어버렸어... 너의.. '버텍스 컬러'
가 아니겠지
팔레트 컬러겠지
앗...!! 오타가 났군요~!!! 수정 끝냈습니다!
ㅎㅎ 파이프라인 설명이 멋지네요
양도 어마어마하네
정말 감사합니다...! 질문하셨을 때 갑자기 기억이 안 나서 많이 당황했어요
호곡...너무길어서...읽다가...힘들어서..내일 읽을래오,...