본문 바로가기
Shader

스탠실 버퍼 사용하기

by 대마왕J 2017. 8. 24.

에또... 그니까 스탠실 버퍼라는게 있어요 


보통 하드웨어 버퍼로, 8비트 즉 0~255 를 가지고 있지요. 그냥 포토샵의 그레이스케일 하나 가지고 있다고 생각하면 편해요 . 음 더 쉽게 말할까? 알파 채널을 가지고 있다고 생각해 보세요!! 


일단 기본은 까맣게 칠해져 있는거죠


네 뭐 이렇게 말이죠


까매요


숫자로는 0 


전부 0이 채워져 있네요 그렇죠 


그럼 이제 플렌을 하나 놓을께요 

아참 쉬워서 앰플리파이드 셰이더 썼어요

이거 코딩도 똑같음





이건 스탠실 버퍼를 이용하게 셋팅했어요 


레퍼런스가 3번이고.. 이거랑 컴페리즌이랑 같이 읽어야 해요. 


이건 이렇게 읽어야 겠네요 '자 .. 3번이란 숫자가 있는데.. 비교해서 몽땅 다(언제나) 통과! 다 찍어!! ' 즉 3번이란 숫자가 있는데 (어케 쓴다고는 안했음)  이걸 가지고 뭐 할것도 없이 그냥 그리겠다는 겁니다. 올웨이즈니까. 그럼 3번은 어디다 쓸라고? 그러게요??

하여간 지금은 그냥 그리네요? 즉 모든 픽셀이 pass 되었다는 말입니다. 


그런데 그 뒤를 보세요 

pass 하면 리플레이스 하라고 되어 있지요? 


즉 '네가 만약 패스 했으면 그 픽셀은 레퍼런스 값으로 스탠실 버퍼를 써라' 라고 되어 있습니다. 


실패했을때는 keep라고 되어 있지만 전부 성공했으니 실패하는 픽셀 자체가 없죠. 

z fail은 z 버퍼에 가려졌을때, 즉 뒤에 가려졌을때도 뭐 별거 할 거 없다라는 뜻이예요. 그냥 가려질 뿐입니다. 



정리하면

"나 3인데, 비교하는거 그런거 무시하고 몽땅 그려!"

" 그리고 내가 쓴 픽셀은 모두 3번으로 바꿔!"


라는 말이 되었죠 


그럼 버퍼 그림은 이케 될겁니다. 



저 플렌이 있는 픽셀 만큼만 3이 될 거예요. 


(3이 저렇게 보일거라고 생각하지 마세요. 0~255 에서 , 0이 3으로 되었는데 거의 안보이는게 정상이죠. 지금 저 그림은 과장입니다 과장) 


하여간 스탠실 버퍼에는 저런 모양으로 되어 있을거라고 상상하시면 돼요 


자 그럼 다음 그림을 하나 만들어 봅시다 


자 빨간 플렌 말고 

파랑 공이 생겼어요 


당연히 메터리얼도 다르고 셰이더도 다르죠 


두 번째 파랑 공에는, 일단 먼저 해 줘야 하는게 있어요. 행여나 '먼저 그려질까' 두려우니까요 


 큐 인덱스를 1로 줘서 , 2000번인 인덱스를 2001번으로 만들어 주겠어요. 

그럼 한 단계 나중에 그려지니까요?!? 


안해도 상관 없는데, 안심하고자 했습니다. 확실하게 확실하게. 


자 어쨌거나 공이 나중에 그려집니다 그쵸?






자 이제 공의 셰이더한테 스텐실을 줘 볼께요 


이렇게요 





자 읽어볼까요?


" 나 3인데, 나랑 '같은' 것만 찍을래' 

라는 뜻이 되지요? 


즉 버퍼에 3번이 찍혀 있으면 그 픽셀은 성공, 아니면 실패인 겁니다. 


짜잔




    

즉 이케 되는 겁니다. 


버퍼는 여전히 변하지 않았죠. 사각형 부분만 3. 

그리고 공이 그려질때 '3이랑 같은 부분만 그린다' 라고 하니까 이렇게 된겁니다. 



이번엔 추가로, 공이 그려질때 또 스탠실 버퍼를 건드리게 하죠. 


지금은 그려만 졌지 안건드렸잖아요?? 버퍼는 여전히 



이 상태예요 ...



그래서 이제 파란 공이 그려질 때 버퍼를 건드리게 해 볼께요 



으힉 ㅋ 


그려진 픽셀은 버퍼값을 내리고! 

실패한 픽셀은 버퍼값을 3으로 바꾸고!

Z 페일 - 가려져서 실패한 것 - 은없으니 두고! 



이대로 하면 어케 될까요 


이케 된다는 말 아인교


즉 버퍼가 어찌 되냐면




이케 됩니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 야호 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ




자 그럼 여기다 하나 더 만들어 볼까요? 



평범한 녹색 드럼통 추가 


이놈은 어쩔까...



이건 '나 0인데, 내가 클 때만 그릴래' 니까 안그려지겠죠. 즉 0보다 작은 놈이 있어야 그린다는건데, 그려질게 없잖아요 0보자 작은 놈이 세상에 어딨어




" 나 0인데, 내가 크거나 같을 때만 그릴래!" 라니까 ... 0보다 작은 놈은 없고 대신 같은건 있죠. 0이라고 

그래서 거기만 그려졌어요 



" 나 0인데, 내가 작을 때만 그릴래!!" 라고 합니다. 

2나 3이 있음 그려지겠죠 




" 나 0인데, 내가 작을 때랑 나랑 같을 때만 그릴래!!" 라고 합니다.  0이면 같으니 그려지고, 2와 3은 자기가 작으니 그려지죠 ㅎ 다 그려집니다 



" 나 0인데,  나랑 같을 때만 그릴래!!"


그러덩가 맘대로 해라 





" 나 0인데,  나랑 같지 않을 때만 그릴래!!"


얼씨구




" 나 0인데,  언제나 그릴래!! 절대 안그릴래!!"


난리났네 







그러니 응용하면 이런것도 되는 겁니다. 예를 들어 3에만 그린다 셋팅하면요 




이렇게 3에만 그려지는 놈도 만들 수 있는 거예요 



요는 두 가지로 보는거죠 


'내가 그려질 때 옵션'


'내가 쓸 때 옵션'




그리고 꼰대질 하듯이 읽으면 됩니다. 


'얌마 나 3인데!!!'


'나랑 같은 놈만 그릴거야!!'



' 성공하면 냅두고!!'


'실패하면 냅두고!!'


'가려져도 냅둬 마!!'


약간 요런 마인드


반응형

댓글