Shader
Shader와 SIMD에 대해서 - 2편
이족보행달팽이
2025. 9. 27. 00:37
Shader와 SIMD에 대해서 - 1편의 연장선 이야기입니다.
float4 mask = saturate( 1.0 - abs( float4(0.0, 1.0, 2.0, 3.0)-c ) );
float MaskColorValue =dot(vertexColor, mask);
1편에서 소개했던 블로그에서 수식을 가져왔습니다.
저 수식의 목적은 RGBA 채널 중 하나의 채널에만 1.0을 값을 부여하고,
나머지는 0.0으로 만드는 것입니다. 이를 런타임 중에 하는 것이 핵심.
위 수식에서 c는 float4값으로 모든 원소의 값이 동일한 형태입니다.
(0.0, 0.0, 0.0, 0.0), (1.0, 1.0, 1.0, 1.0), (2.0, 2.0, 2.0, 2.0), (3.0, 3.0, 3.0, 3.0)
등의 형식으로 선택해서 넣을 수 있습니다.
저 식에서 핵심은 saturate가 0~1사이값만 받는것입니다.
0보다 작다면 0으로, 1보다 크다면 1로 고정하는 방식입니다.
그렇기에 1에서 값을 뺀 수가 절대값으로 0이 아닌이상 무조건 1보다 줄어드는 형식입니다.
그래서 c값에 따라 채널을 다음과 같이 매칭됩니다.
| 값 | Color Channel |
| 0.0 | Red |
| 1.0 | Green |
| 2.0 | Blue |
| 3.0 | Alpha |
그 후, dot를 통해 마스크된 값의 값을 구할 수 있습니다.
dot는 기본적으로 2가지 연산방법이 존재합니다.
1.각 원소들의 곱을 구한 후, 해당 원소들의 값들의 합
2.두 벡터길이 곱한 후 cos값 곱
보통 1번의 방식으로 연산이 이루어진다.
즉 원소끼리 곱할때 0.0값이 들어가면서 자연스럽게 해당값이 날라가고 필요한 마스킹된 데이터만 얻을 수 있다.