[게임 개발 및 쉐이더] GLSL 에서 화면 글리치 효과 불규칙적으로 주는 방법 - Whitmem
[게임 개발 및 쉐이더] GLSL 에서 화면 글리치 효과 불규칙적으로 주는 방법
Graphic Development
2025-01-20 20:00 게시 b83120750f2767069053

0
0
87
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이전 게시물 돌아보기
이전 게시물에서는 일정 시간 간격으로 화면이 깨지는 효과를 내는 쉐이더를 만들어보았다.
https://whitmem.kr/read/338
이번에는 이 쉐이더를 사용해서 임의 랜덤 확률의 경우에만 화면이 깨지게끔 구현해보자.
임의로 랜덤 수치를 생성하여, 랜덤 수치가 특정 범위 이상인 경우 글리치를 할당하고, 그 미만인 경우 글리치를 할당하지 않게끔 구현할 수 있다.
구현 방법은 간단하다. 이미 rand 함수를 구현했기 때문에 0~1 사이의 랜덤 값을 할당하는 함수를 사용하여 이 값이 일정 범위 이상인 경우에만 글리치를 합성하면 된다.
float glitch = step(0.7, rand(mod(time,2) * 5.0));
위 코드는 랜덤 값이 0.7 이상인 경우 glitch는 1이 되고, 아닌 경우 0이 할당되는 코드이다.
float timeScaled = cutValue(time,10); timeScaled*=glitch; float gapR = 0; float gapG = 0; float gapB = 0; if(timeScaled!=0){ gapR =sin(rand(stair(uv+timeScaled+1,10)))*0.020; gapG = sin(rand(stair(uv+timeScaled+2,10)))*0.020; gapB = sin(rand(stair(uv+timeScaled+3,10)))*0.020; }
glitch 값이 1이 나오는 경우 기존 timeScaled이 유지되도록 하고, 0이 나온 경우 timeScaled를 0으로 유지한다. 0인 경우 이미지를 합성하지 않고, 1인 경우 글리치가 적용되게끔 한다.
void main() { vec2 uv = oUV; float glitch = step(0.7, rand(mod(time,2) * 5.0)); float timeScaled = cutValue(time,10); timeScaled*=glitch; float gap = 0; if(timeScaled!=0){ gap =sin(rand(cutValue(uv.x+timeScaled+1,10)))*0.020; } vec2 uvg = clamp(uv + gap,0.0,1.0); vec4 color = texture(tex, uvg); outColor = vec4(color.r , color.g, color.b, 1.0); }
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.