이 두 이미지는 다른 방법을 통해 만들어졌습니다.
첫번째는 반 고흐가 직접 레이어 위에 레이어를 쌓는 방식으로 만들어졌고, 제법 시간이 걸렸을 것입니다.
두번째는 몇 초 안되는 시간안에 픽셀들의 행렬 연산을 통해 만들어졌습니다.
여기서 중요한 점은 두번째 이미지는 그림을 부분부분 따로 그려낸 것이 아니라, 그림의 모든 부분이 동시에 한번에 그려졌다는 것입니다.
OpenGL Shading Language (a.k.a Shader)
쉐이더는 배경이나 캐릭터와 같은 게임의 그래픽 요소들이 화면에 어떤 색상의 픽셀로 보여질지를 계산해줍니다.
OpenGL Shading Language를 줄여서 GLSL이 그 정식 명칭이고, 보통 쉐이더라고 편하게 부르곤 합니다.
shader를 쓴 작업과 그렇지 않은 작업에서는 굉장히 시각적으로 큰 차이가 있습니다.
glsl 단위에서 코딩을 하지 않은, 쉐이더를 사용하지 않은 작품은 점선면에 도형을 뚜렷하게 조합한 작업들이라고 볼 수 있습니다.
물론 이것으로도 충분히 많은 효과를 낼 수 있지만 어디까지나 그 표현력이 점선면에 기하학적 도형의 조합으로 한정이 돼버립니다.
그러나 쉐이더를 활용한 작업은 점선면을 뛰어넘어서 픽셀 하나하나에 맞게 단위에서 조작이 가능하고, 색채 표현이 가능하기 때문에, 더 부드러운 효과를 낼 수 있습니다.
Visual Programming
따라서 보다 아름답고 풍부한 범위에서 비주얼 프로그래밍을 다루시려는 분들에게 유용한, 그리고 직접적인 코딩이 가능하게끔 도와줄 수 있는 언어가 쉐이더입니다.
쉐이더는 빠르다
쉐이더는 이렇게 복잡하고 화려한 시각적 효과를 굉장히 빠른 속도로 처리할 수 있다는 장점이 있는데요.
그렇다면, 쉐이더는 어떤 이유에서 빠를 수 있는 걸까요?
이를 알기 위해서는 CPU와 GPU의 차이점을 이해해야 합니다.
차이를 알고 계시는 분들도 계시겠지만, 비유를 들어 설명해드리자면 일처리를 하는 점에서 CPU는 성능이 좋은, 파괴력이 굉장히 강한 한 대의 대포라고 할 수 있고, GPU는 대포에 비하면 파괴력이 약한 소총, 그러나 소총이 한 대가 아니라 여러 다발이 묶여있다고 생각할 수 있다고 비유할 수 있겠습니다.
즉, 단위 스레드당 처리할 수 있는 능력은 GPU에 비해 CPU가 비할 바 없이 강력하고 빠릅니다.
그러나 그래픽 프로그래밍에서는 pixel by pixel 연산을 해야할 때가 있습니다.
즉, 모니터에 보여줄 스케치의 모든 픽셀에 각각 접근해서 색을 일일이 지정해줘야 하는 경우를 예시로 들면 화면에 가로 길이 * 세로 길이만큼의 반복 횟수를 거쳐서 픽셀에 접근을 해야합니다. 즉, 가로 길이 2880px, 세로 길이 1800px인 비율의 디스플레이의 경우에 초당 60frame이라고 가정하면 1초에 무려 처리해야 될 반복 횟수가 1800*2880*60으로 3억 번이 넘어갑니다.
cpu가 픽셀에 접근을 해서 색을 바꾸는 일쯤이야 어려운 일이 아니지만, 반복 횟수가 3억 번이 넘어가는 정도로 처리할 게 많아지다 보니까 일을 순차적으로 한 번에 하나씩 처리하는 cpu의 특성상 그래픽 처리를 전담하기에 한계가 있고, frame rate도 떨어질 우려가 있습니다.
그래서 이러한 성능의 문제를 해결하기 위해 가장 좋은 해결책이 GPU의 힘을 빌리는 GLSL 코딩입니다.
하나하나씩 순차적으로 일을 처리해 가느라 시간이 오래 걸렸다면 gpu는 여러 대의 소총 다발이 각각 업무를 나눠 맡아서 많은 분량의 일을 동시에 한 번에 처리하기 때문에 화면에 빠르게 출력할 수 있습니다.
쉐이더로 짠 코드는 모든 픽셀에 동시적으로 한 번에 적용되어서 굉장히 빠른 속도로 pixel by pixel 연산을 처리할 수 있게 됩니다.
쉐이더는 어디에서 사용이 되는 걸까요?
표면상으로 무한해 보이는 효과를 만들기 위해 영화 후처리, CGI, 비디오 게임, 단순한 광원 모델을 떠나, 더 복잡한 이용에는 영상이나 사진 편집앱에서 쉽게 볼 수 있는 색조, 채도, 밝기, 대비를 변경하는 일, 그리고 블러, 왜곡, 크로마 키 (이른바 블루스크린/그린스크린 효과), 테두리 검출, 모션 감지 등에 사용이 됩니다.
출처
'GDSC Sookmyung 활동 > 10 min Seminar' 카테고리의 다른 글
Web 3.0이란? (0) | 2022.04.04 |
---|---|
자연어 : 전처리부터 임베딩까지 (0) | 2022.03.14 |
Promise와 async/await (0) | 2022.02.28 |
#야나도#쿠버네티스#들어봤어 (0) | 2022.02.28 |
http와 https (0) | 2022.02.21 |