shader에서 채널값이 모자를 때...

반응형

텍스쳐마다 채널이, R/ RG/ RGB/ RGBA 등이 있는데 가끔 채널 하나가 더 필요할 때가 있다.

예를들어 R채널에는 Diffuse Mask, G채널에는 Rim Mask, B채널에는 Specular Mask, A채널에는 depth를 

넣는데 추가로 offset값을 저장해 줘야 할 때가 있다. 

그럴때 가끔 fmod를 사용해서 하나에 두개의 값을 넣게 하는 방법을 쓴 적이 있다.

z값(B채널)이 0.0f ~ 1.0f 사이이고 offset 값이 1.0f에서 10.0f 사이라면 

z값에 기존값 * 0.01f하고 offset 값을 *0.1f 해서 더한 후 다음 패스에서 이 값을 fmod로 z값을 구한 후

기존값에서 빼면 z값만 구할수 있긴 하다. 다만 offset 값이 1.0f~10.0f 조건에 추가로

단차가 0.1f 단위여야 한다는 조건이 붙는다.

1.1f는 가능하지만 1.01f는 기존값고 정밀도를 더 나눠써야 한다.

가끔 이런방식으로 작업을 해서 쓰긴 하는데 fmod자체가 그렇게 단순 연산만큼 가볍지는 않지만

텍스쳐 한장 더 써서 한번 더 찍어야 하는 상황에서는 나름 괜찮았던것 같다.


float2 fmod(float2 a, float2 b)

{

  float2 c = frac(abs(a/b))*abs(b);

  return (a < 0) ? -c : c;   /* if ( a < 0 ) c = 0-c */

}


Reference Link

- fmod

-

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

What is Texture  (0) 2018.03.10
texture format  (0) 2018.02.21
depth-precision-visualized  (0) 2018.01.31
디더링 (Dithering)  (0) 2018.01.26
Texture types  (1) 2017.02.05
TAGS.

Comments