NGUI의 UIPanel의 속성에 따른 Shader File Name

반응형

shader 작업을 하다가 ngui의 특정 패널에 붙어있는 uisprite가 내가 지정해둔

custom shader로 돌아가지 않는 현상을 발견했다.

그래서 아래와 같은 상황을 점검해 봤다.



1. UISprite에서 사용하고 있는 Atlas의 Material의 shader가 내가 만든 customSprite로

   설정이 되어있는가?  Yes

2. 혹시 UIPanel내에서 shader를 직접연결하는 코드가 있는가? No

3. 정말 내가 설정해둔 custom shader로 렌더링이 안되는가? Yes

   Frame Debug로 최종 렌더링시 지정한 shader를 쓰지 않는것을 발견.

   실제 customSprite shader의 pixel shader에서 return fixed4(1,0,0,1)으로 결과값이 반영안됨.

4. 다른곳에 있으면(다른 패널) 제대로 customSprite shader를 쓰는가? Yes


그렇다면 UIPanel의 문제인가?

이 UIPanel이 다른 UIPanel과 다른건 무었인가?


살펴보니 UIPanel의 Cliping 방식이 다름

SoftClip를 사용하고 있음.

그래서 SoftClip으로 전체 검색해 보니 의심스러운 곳이 보인다.

UIDrawCall.cs에서 CreateMaterial()함수에 보면 mClipCount가 1이 되고

이 값으로 셰이더 이름을 바꾸고 있다.


그래서 SoftClip으로 설정하면 렌더링 할 때 shader 이름이 "customSprite"가 아니라

"customSprite 1" 이 된다.


실제로 NGUI의 셰이더 코드들을 보면 아래와 같이 되어있다.


같이 셰이더에 뒤에 넘버링만 되어있다.

이는 UIPanel에서 하위 오브젝트를 그릴때 Cliping 속성값에 따라 

셰이더 파일을 바꿔주는 부분이 있어서 그와 짝을 맞추기 위해 셰이더 파일을

위와같은 네이밍 방식으로 만들어 준듯하다.


그래서 내가 만약 특정 atlas를 위해 shader을 구현하였다면

UIPanel의 특성에 맞게 추가 셰이더 파일을 넘버링하여 만들어야 하는 상황이 

생긴다는 것이다.



'Unity > Unity Graphics' 카테고리의 다른 글

Shader LOD  (0) 2016.09.29
hdr texture를 위한 bc6h  (0) 2016.09.05
Depth and Normal Textures (Part 3)  (0) 2016.07.24
Depth and Normal Texture (Part 2)  (0) 2016.06.13
Unity에서 Depth Texture의 사용  (0) 2016.04.29
TAGS.

Comments