본문 바로가기
프로그래밍/그래픽스

컴퓨터그래픽스 - 셰이더(Shader)

by moo-ti 2023. 8. 28.
반응형

컴퓨터 그래픽스 분야에서 셰이더(shader)는 소프트웨어 명령의 집합으로 주로 그래픽 하드웨어의 렌더링 효과를 계산하는 데 쓰인다. 셰이더는 그래픽 처리 장치(GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 프로그래밍하는 데 쓰인다.

그래픽 처리장치(GPU)는 컴퓨터 시스템에서, 그래픽 연산을 빠르게 처리하여 결괏값을 모니터에 출력하는 연산 장치이다. VPU라고도 한다. GPU는 임베디드 시스템, 휴대 전화, 개인용 컴퓨터, 워크스테이션, 비디오 게임 콘솔, 인공지능, 무인 자동차, 클라우드 컴퓨팅 등에 사용된다. 현대의 GPU는 컴퓨터 그래픽과 영상 처리에 매우 효과적으로 사용되며, 고도의 병행 구조는 큰 덩어리의 영상 데이터가 병행 처리되는 알고리즘에 다용도 CPU보다 능률적이다. 개인 컴퓨터에서 GPU는 그래픽 카드에 부착되고, 메인보드나 CPU에 따라서는 다이(집적 회로에서는 반도체 물질의 자그마한 사각형 조각을 말하며, 여기에 회로가 제작되어 있다.)에 포함되기도 한다.

셰이더는 표면상으로 무한해 보이는 효과를 만들기 위해 영화 후처리, CGI(컴퓨터 생성 이미지), 비디오 게임에 널리 쓰인다. 단순한 광원 모델을 떠나, 더 복잡한 이용에는 영상의 색조, 채도, 밝기, 대비를 변경하는 일과 블러, 라이트 블룸, 입체 광원, 심도 효과를 위한 노멀 매핑, 보케, 셀 셰이딩, 포스터리제이션, 범프 매핑, 왜곡, 크로마키 (이른바 블루스크린/그린스크린 효과), 테두리 검출, 모션 감지, 사이키델리아 효과 제작 등을 포함한다.

 

 

https://youtu.be/iM8cMIrI3So?si=V5mokaAmLrjNorIE 

CGI Animated Short Film: "Ice Cream" by Super Dope | @CGMeetup

컴퓨터 생성 이미지(computer-generated imagery: CGI)
컴퓨터 생성 이미지(computer-generated imagery, CGI)는 컴퓨터 그래픽스 분야의 응용이며, 더 구체적으로 말해 영화, 텔레비전 프로그램, 광고, 시뮬레이터, 시뮬레이션, 인쇄 매체의 특수 효과를 위한 3차원 컴퓨터 그래픽스를 말한다.
비디오 게임은 보통 실시간 컴퓨터 그래픽스(이를 CGI라고 부르는 경우는 드물다)를 사용하지만 미리 렌더링 된 컷 장면과 CGI를 응용한 소개 동영상을 포함할 수 있다. 이러한 것을 FMV(풀 모션 비디오)라고 한다.
컴퓨터가 만들어 내는 효과들은, 미니어처와 같은 물리적인 처리 이상으로 제어가 가능하고 다른 기술로는 불가능한 영상을 만들어 낼 수 있으므로 CGI는 시각 효과에 사용된다. 기술자가 여러 명의 배우, 값비싼 세트장, 후원사 없이도 콘텐츠를 만들어 낼 수 있다.
3D 맥스, 마야, 소프트 이미지 XSI와 같은 컴퓨터 소프트웨어는 동영상 등을 위해 CGI를 만드는 데 사용한다. CGI 소프트웨어가 최근 급격히 이용하기 쉬워지고, 컴퓨터 속도가 빨라짐에 따라 개별 기술자들과 중소기업이 가정용 컴퓨터로부터 전문가급의 영화, 게임, 영상을 생산할 수 있게 되었다.
시뮬레이터, 특히 비행 시뮬레이터는 CGI 기술을 사용하여 Outside World (OTW) 를 나타낼 수 있다.

Direct3D와 OpenGL 그래픽 라이브러리는 다음과 같이 세 가지의 세이더를 사용한다.

버텍스 셰이더(Vertex Shader)
버텍스 셰이더는 주로 물체의 정점 정보에 수학적인 연산을 함으로써 물체에 특별한 효과를 주는 데 쓰인다. 각각의 정점이 정의되는 방법은 다양하다. 정점이 가지는 정보는 예를 들어 3차원의 위치를 나타내는 x, y, z 좌표나, 색상, 텍스처, 조명 정보 등이 있다. 버텍스 셰이더는 이런 정점의 정보 값을 변화시켜서, 물체를 특별한 위치로 옮기거나, 텍스처를 바꾸거나, 색상을 바꾸는 등의 일을 할 수 있다. 하지만 기존의 정점을 지우거나 새로운 정점을 추가하는 등의 작업은 할 수 없다.
버텍스 셰이더는 어셈블리어나 Cg, GLSL, HLSL 등으로 프로그래밍이 된다.

지오메트리 셰이더(Geometry Shader)
지오메트리 셰이더는 버텍스 셰이더에서는 할 수 없는 점이나, 선, 삼각형 등의 도형을 생성할 수 있는 기능이 있다.
지오메트리 셰이더 프로그램은 버텍스 셰이더가 수행되고 난 뒤에 수행된다. 지오메트리 셰이더 프로그램은 버텍스 셰이더를 거쳐온 도형 정보를 입력받는데, 예를 들어 정점 3개가 지오메트리 셰이더에 들어오면, 셰이더는 정점을 모두 없앨 수도 있고 더 많은 도형을 만들어 내보낼 수도 있다. 지오메트리 셰이더를 지나간 도형 정보는 레스터라이즈를 거친 뒤 픽셀 셰이더를 통과하게 된다.
지오메트리 셰이더는 테셀레이션이나 그림자 효과, 큐브 맵을 한번의 처리로 렌더링하는 데에 주로 쓰인다.
지오메트리 셰이더는 어셈블리어나, Cg, HLSL, GLSL 등으로 프로그래밍할 수 있다. 지오메트리 셰이더는 DirectX 10 버전부터 시작되었으므로, DirectX10 버전 이상의 HLSL로만 프로그래밍할 수 있다. OpenGL은 3.2 이상부터 GLSL로 프로그래밍할 수 있다.

픽셀 셰이더
픽셀 셰이더는 렌더링 될 각각의 픽셀들의 색을 계산한다. 따라서 픽셀 셰이더는 최종적으로 픽셀이 어떻게 보일지를 결정한다. 픽셀 셰이더는 간단하게 언제나 같은 색을 출력하는 간단한 일에서부터, 텍스처로부터 색을 읽어오거나, 빛을 적용하는 것, 범프 매핑, 그림자, 반사광, 투명 처리 등 복잡한 현상 등을 수행할 수 있다.
픽셀 셰이더는 각각의 픽셀들이 렌더링될 때 수행되기 때문에, 다른 픽셀들과 아무런 연관이 없다. 픽셀 셰이더는 오직 한 픽셀만을 연산하기 때문에, 주변의 픽셀이나, 그리는 도형에 대한 정보를 알 수 없다. 이 때문에 픽셀 셰이더는 스스로 매우 복잡한 효과를 만들어 낼 수는 없다.
픽셀 셰이더는 픽셀의 색 말고도 깊이(Z 버퍼에 쓰인다)나 또 다른 색(다른 렌더 목표물에 쓰인다)을 출력할 수 있다.
픽셀 셰이더 프로그램은 주로 어셈블리어, Cg, GLSL, HLSL 등으로 짜인다.
Cg는 엔비디아가 마이크로소프트와 협력하여 개발한 상위 레벨 셰이딩 언어이다. 마이크로소프트의 HLSL과 매우 비슷하다. Cg는 C 언어를 기반으로 하며, C 언어와 같은 문법을 가졌지만 일부 기능들은 변형되고 그래픽 처리 장치를 프로그래밍하기에 적절한 새로운 자료형이 추가되었다.

 

반응형