Shader

Shader와 SIMD에 대해서 - 2편

이족보행달팽이 2025. 9. 27. 00:37

Shader와 SIMD에 대해서 - 1편의 연장선 이야기입니다.

https://figix.tistory.com/114


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값이 들어가면서 자연스럽게 해당값이 날라가고 필요한 마스킹된 데이터만 얻을 수 있다.