특정 시간 마다 끊어내는 cutValue 함수에 대해서 - Whitmem
특정 시간 마다 끊어내는 cutValue 함수에 대해서
Graphic Development
2025-01-22 21:11 게시 87b8080831790176e4be

0
0
58
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
최근 쉐이더를 개발할 때 나는 다음과 같은 함수를 선언하여 사용하곤 했는데, 이 부분에 대해서 자세히 설명한 적이 없어 게시글을 따로 분류하여 서술한다.
float cutValue(float value, float scale){ return round(value * scale) / scale; }
위 함수의 의도는 어떤 연속적인 함수에 대해서 불연속적인 값으로 바꿔주기 위한 것이다.
쉽게 말해, 초를 의미하는 어떤 변수는 0, 0.01, 0.02,. ... 0.1 .... 1초 와 같이 시간에 종속적인 연속적인 값이 담아 들어온다.
GLSL 나 쉐이더에서 움직이는 처리나 다양한 효과를 위해서는 매번 다른 이펙트를 위해 시간을 변수를 사용할 수 밖에 없다. 그러기 위해서 TIME (s) 내장 변수를 사용하거나, uniform 을 통해 시간을 입력받아 사용한다.
그런데 만약 3초에 한 번꼴로 동작하는 어떤 걸 만들고 싶을 때 상태 변수를 사용해서 처리하기란 매우 비효율적이기 때문에, 연속적인 시간 변수를 불연속적인 시간으로 변환하여 사용할 수 있다.
예를 들어 노이즈를 생성하는 noise 함수나, 난수를 생성하는 rand 함수가 있을 때 우리는 매번 다른 결과를 받아오기 위해 TIME 데이터를 더한다. TIME 데이터는 매 프레임마다 조금씩 바뀌기 때문에 매 프레임마다 다른 노이즈가 생성된다.
3초에 한 번꼴로만 노이즈를 변경하고 싶을 때, 시간 값이 3초에 한번씩만 갱신되도록 하면 된다. 이를테면 0초... 3초... 6초... 9 초... 형식으로만 출력 되게끔 말이다.
만약 초 단위로 잘라내고자 하는 경우 단순히 소수만 버려주면 1초...2초....3초...4초.... 비교적 불연속적인 실수 값을 얻을 수 있다. 이 값을 시간 변수로 사용하면 초가 바뀔 때만 노이즈가 바뀌거나 등 효과를 낼 것이다.
하지만 3초 등 지정된 시간으로 하기 위해서는 소수를 단순히 버려주는건 의미가 없다. 초를 나타내는 실수 데이터를 1/3 한 뒤 거기서 소수를 버린다. 그러면 0~1이라는 범위 안에 들어가는 3초의 세세한 데이터는 사라진다. 그리고 다시 3을 곱하여 원상 복귀시켜주면, 3초 단위로 카운팅되는 시간 함수를 만들 수 있게 되는 것이다.
위 cutValue 는 그러한 역할을 하는 임시 함수일 뿐이다.
이러한 함수는 시간 변수에만 사용하는 것이 아닌 연속적인 데이터를 가지는 것이라면 어디서든지 사용할 수 있다. UV 데이터에 사용하면 일정한 UV 간격으로 처리를 한다든지 규칙을 부여하여 처리할 수 있다.
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.