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 |