ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 셰이더(shader)는 무엇인가?
    Apple🍎/Metal 2025. 3. 20. 22:27

    다음은 애플 디벨로퍼 홈페이지에 있는 Metal 의 소개입니다. 

    일단 Metal 을 사용하면 GPU 프로그래밍을 가능하게 해준다고는 들었는데, 셰이딩 언어는 또 뭘까요? 

    사실 GPU(Graphics Processing Unit)는 그래픽 랜더링을 하기 위해 만들어진 만들어진 장치입니다.

    따라서 GPU 프로그래밍을 이해를 위해 그래픽 프로그래밍의 발전과정을 함께 셰이더라는 용어에 대해 알아보도록 하겠습니다. 

     

    고정 파이프라인 시대 (1990년대 초반)

    1990년대 초반, 3D 그래픽을 표현하는 방식은 지금과 매우 달랐습니다. 이 시기에는 '고정 파이프라인'이라는 방식으로 그래픽 렌더링이 이루어졌습니다. 이는 마치 조립 라인과 같이, 3D 그래픽을 처리하는 단계가 하드웨어 제조사에 의해 사전에 정의되고 고정되어 있었음을 의미합니다.

    개발자들은 이 고정된 파이프라인에서 제공하는 한정된 함수들만 사용할 수 있었습니다. 예를 들어, 조명 계산을 위해 Gouraud 셰이딩이나 Phong 셰이딩 중 하나를 선택할 수 있었지만, 그 내부 작동 방식을 수정할 수는 없었습니다. 물체의 텍스처를 어떻게 입힐지, 빛이 물체에 어떻게 반사될지 등을 세밀하게 제어할 수 없었죠.

     

    이 시기의 3D 그래픽은 큰 픽셀, 각진 모서리, 제한된 색상 팔레트가 특징이었습니다. 'Doom'이나 '울펜슈타인 3D' 같은 게임을 떠올려보세요. 이런 게임들은 당시로서는 혁신적이었지만, 오늘날의 기준으로 보면 매우, 매우 단순한 그래픽을 가지고 있었습니다.

    당시 그래픽스 파이프라인은 다음과 같은 고정된 단계로 구성되어 있었습니다.

    1. 정점 변환 (Vertex Transformation)
    2. 삼각형 설정 (Triangle Setup)
    3. 래스터화 (Rasterization)
    4. 텍스처 매핑 (Texture Mapping)
    5. 조명 계산 (Lighting Calculation)
    6. 색상 출력 (Color Output)

    이 각 단계는 하드웨어에 고정되어 있었고, 프로그래머는 단지 입력 데이터(정점 위치, 텍스처 등)만 제공할 수 있었습니다.

    셰이더의 탄생: 프로그래밍 가능한 그래픽 (1990년대 후반~2000년대 초반)

    '셰이더'라는 용어는 원래 '그림자를 만든다(to shade)'는 의미에서 시작되었습니다. 컴퓨터 그래픽스의 개척자 중 한 명인 Rob Cook과 그의 팀이 픽사(Pixar)에서 개발한 RenderMan 시스템에서 처음으로 "셰이더" 개념이 공식적으로 도입되었습니다. 이는 영화 제작을 위한 것이었고, 실시간 렌더링이 아닌 오프라인 렌더링에 사용되었습니다.

     

    RenderMan의 셰이더는 물체의 표면이 빛을 받을 때 어떻게 보일지 계산하는 작은 프로그램이었습니다. 기본적인 아이디어는 간단했습니다: 물체의 재질과 조명 효과를 독립적인 프로그램으로 정의하여 더 사실적이고 다양한 시각 효과를 만들어내자는 것이었습니다.

     

    1999년, NVIDIA는 GeForce 256을 출시하며 "세계 최초의 GPU(Graphics Processing Unit)"라고 불렀습니다.

    3D 그래픽 파이프라인에서 기존에는 CPU가 수행하던 좌표 변환 연산과 조명 처리(T&L(Transform and Lighting) 연산)를 GPU가 담당하게 되었습니다. 하지만 아직 완전히 프로그래밍 가능하지는 않았습니다. 

     

    이후 2001년 NVIDIA의 GeForce 3와 Microsoft의 DirectX 8이 함께 등장하면서 시작되었습니다. 이들은 게임 개발자에게 처음으로 프로그래밍 가능한 정점 셰이더(Vertex Shader)와 픽셀 셰이더(Pixel Shader, 또는 Fragment Shader)를 제공했습니다.

     

    정점 셰이더는 3D 모델의 각 정점(꼭지점)을 어떻게 처리할지 정의했습니다. 이를 통해 개발자들은 3D 공간에서 물체의 위치, 회전, 크기를 직접 제어할 수 있게 되었고, 더 나아가 물결 효과나 옷감 움직임 같은 복잡한 애니메이션도 구현할 수 있게 되었습니다.

    픽셀 셰이더는 화면의 각 픽셀 색상을 어떻게 계산할지 정의했습니다. 이로 인해 텍스처 매핑, 조명, 그림자, 반사 등을 더 세밀하게 제어할 수 있게 되었고, 물, 금속, 피부 같은 복잡한 재질을 더 사실적으로 표현할 수 있게 되었습니다.

    초기 셰이더 프로그램은 어셈블리어와 유사한 저수준 언어로 작성되었습니다. 이는 매우 제한적이었고, 복잡한 효과를 구현하기 위해서는 상당한 전문 지식이 필요했습니다. 하지만 이것만으로도 당시로서는 혁명적인 발전이었습니다.

    셰이더 모델의 진화 (2002-2006)

    2002년, Microsoft의 DirectX 9 출시는 셰이더 기술의 중요한 전환점이었습니다. DirectX 9는 셰이더 모델 2.0과 3.0을 도입했고, 이로 인해 훨씬 더 복잡한 셰이더 작성이 가능해졌습니다. 이전 모델에서는 명령어 수가 극히 제한되어 있었지만, 새로운 모델에서는 더 긴 프로그램과 더 복잡한 수학적 연산이 가능해졌습니다.

    더 중요한 것은, 이 시기에 고수준 셰이더 프로그래밍 언어가 등장했다는 점입니다.

    1. HLSL (High-Level Shading Language): Microsoft가 DirectX용으로 개발한 C와 유사한 문법의 언어
    2. GLSL (OpenGL Shading Language): OpenGL 표준의 일부로 개발된 언어
    3. Cg (C for Graphics): NVIDIA가 개발한 크로스 플랫폼 셰이더 언어

    이러한 고수준 언어는 셰이더 프로그래밍을 훨씬 더 접근하기 쉽게 만들었습니다. 개발자들은 이제 어셈블리어 대신 C와 유사한 문법을 사용하여 셰이더를 작성할 수 있게 되었고, 이는 더 복잡한 효과를 더 쉽게 구현할 수 있게 했습니다.

    이 시기의 기술적 발전은 게임 그래픽의 품질을 극적으로 향상시켰습니다. 'Half-Life 2', 'Doom 3', 'Far Cry'와 같은 게임들은 이전에는 불가능했던 수준의 사실적인 조명, 그림자, 물 효과를 선보였습니다.

    특히 'Doom 3'는 당시로서는 혁신적인 실시간 그림자 매핑 기술을 사용하여 공포 분위기를 극대화했습니다. 이 게임의 각 광원은 동적 그림자를 생성했고, 이는 모두 셰이더를 통해 실시간으로 계산되었습니다.

    셰이더 모델 3.0의 도입으로 동적 분기(dynamic branching)가 가능해졌는데, 이는 셰이더 내에서 조건문(if-else)을 사용할 수 있게 된 것을 의미합니다. 이로 인해 더 다양한 상황에 적응할 수 있는 지능적인 셰이더를 작성할 수 있게 되었습니다.

    이 시기에 "Shader Effects"라는 개념도 인기를 얻었습니다. 이는 여러 셰이더를 조합하여 복잡한 시각 효과를 만드는 방식으로, 많은 게임 엔진과 그래픽 도구에서 채택되었습니다.

    통합 셰이더 아키텍처 (2006-2010)

    2006년, 그래픽스 하드웨어 아키텍처에 혁명적인 변화가 일어났습니다. NVIDIA는 GeForce 8 시리즈를 출시하며 "통합 셰이더 아키텍처(Unified Shader Architecture)"라는 새로운 개념을 도입했습니다. Microsoft의 DirectX 10도 이 시기에 맞춰 출시되어 이 새로운 아키텍처를 지원했습니다.

    이전까지의 GPU는 정점 처리와 픽셀 처리를 위한 별도의 하드웨어 유닛을 가지고 있었습니다. 정점 셰이더 유닛은 오직 정점 연산만 수행할 수 있었고, 픽셀 셰이더 유닛은 오직 픽셀 연산만 수행할 수 있었습니다. 이러한 구조는 비효율적일 수 있었는데, 예를 들어 한 장면에서 정점 처리가 많이 필요한 경우 정점 셰이더 유닛은 과부하되지만 픽셀 셰이더 유닛은 상대적으로 여유로울 수 있었기 때문입니다.

     

    통합 셰이더 아키텍처에서는 모든 셰이더 유닛이 동일해졌습니다. 이제 각 셰이더 코어는 필요에 따라 정점 처리, 픽셀 처리, 또는 새로 도입된 기하 처리를 수행할 수 있게 되었습니다. 이렇게 하드웨어 자원을 동적으로 할당할 수 있게 되어 전체적인 효율성이 크게 향상되었습니다.

    DirectX 10과 함께 도입된 "기하 셰이더(Geometry Shader)"는 새로운 유형의 셰이더로, 정점 셰이더와 픽셀 셰이더 사이에 위치합니다. 기하 셰이더는 전체 프리미티브(삼각형, 선, 점 등)를 입력으로 받아 이를 변형하거나 완전히 새로운 프리미티브를 생성할 수 있었습니다. 이는 풀, 털, 파티클 효과 등을 구현하는 데 특히 유용했습니다.

     

    이 시기의 또 다른 중요한 발전은 "인스턴싱(Instancing)" 기술의 개선이었습니다. 인스턴싱을 통해 동일한 객체를 여러 번 그릴 때 CPU-GPU 간 통신 오버헤드를 크게 줄일 수 있게 되었습니다. 이는 숲이나 군중 장면처럼 비슷한 객체가 많이 등장하는 환경을 렌더링할 때 특히 중요했습니다.

    Crysis(2007)와 같은 게임은 통합 셰이더 아키텍처와 DirectX 10의 역량을 최대한 활용하여 당시로서는 믿기 힘들 정도로 사실적인 그래픽을 선보였습니다. 사실 "But can it run Crysis?"(이 컴퓨터로 크라이시스를 돌릴 수 있을까?)라는 문구는 컴퓨터의 성능을 묻는 유행어가 될 정도였습니다.

    이 시기에는 셰이더의 복잡성과 길이가 크게 증가했습니다. 초기 셰이더는 단지 몇 줄의 코드로 구성되었지만, 이제 수백 줄에 달하는 복잡한 프로그램이 되었습니다. 이로 인해 셰이더 개발을 위한 더 나은 도구와 디버깅 기술이 필요하게 되었습니다.

    GPGPU의 시작: 그래픽을 넘어서 (2007-2010)

    2000년대 중반부터, 연구자들과 개발자들은 GPU의 병렬 처리 능력이 그래픽 이외의 작업에도 매우 유용하다는 것을 깨닫기 시작했습니다. GPU는 본질적으로 많은 간단한 연산을 동시에 수행하는 데 최적화되어 있었기 때문에, 과학적 계산, 데이터 처리, 시뮬레이션 등에 활용할 수 있는 엄청난 잠재력을 가지고 있었습니다.

    이렇게 'General-Purpose GPU(GPGPU)' 컴퓨팅이라는 새로운 패러다임이 등장했습니다. 초기에는 꽤 번거로운 방식으로 이루어졌는데, 개발자들은 그래픽스 API(DirectX나 OpenGL)를 '속여서' 그래픽과 관련 없는 계산을 수행하게 해야 했습니다.

    구체적으로, 과학적 계산 데이터를 텍스처 형식으로 인코딩하고, 프래그먼트 셰이더를 이용해 이 '텍스처'에 대한 연산을 수행한 후, 결과를 다시 텍스처에 렌더링하는 방식이었습니다. 이는 마치 망치를 사용해 나사를 박는 것과 같이 적합하지 않은 도구를 사용하는 느낌이었지만, 그럼에도 불구하고 CPU만 사용할 때보다 훨씬 빠른 결과를 얻을 수 있었습니다.

    2007년, NVIDIA는 이런 불편함을 해소하기 위해 CUDA(Compute Unified Device Architecture)를 출시했습니다. CUDA는 C/C++와 유사한 문법을 사용하여 GPU에서 직접 범용 계산을 수행할 수 있게 해주는 플랫폼과 프로그래밍 모델이었습니다. 이제 개발자들은 그래픽스 API를 우회하지 않고도 GPU의 병렬 처리 능력을 활용할 수 있게 되었습니다.

    2009년에는 Apple, AMD, Intel, NVIDIA 등의 기업이 참여한 Khronos Group이 OpenCL(Open Computing Language)을 발표했습니다. OpenCL은 CUDA와 유사하지만 여러 제조사의 하드웨어에서 작동하는 개방형 표준이었습니다.

    GPGPU 컴퓨팅이 특히 유용했던 분야는 다음과 같습니다.

    1. 과학적 시뮬레이션: 기상 예측, 유체 역학, 분자 동역학 등
    2. 암호화: 비밀번호 해시 계산, 암호화폐 채굴
    3. 머신 러닝: 신경망 훈련 및 추론
    4. 신호 처리: 오디오 및 영상 처리, 레이더 데이터 분석
    5. 금융 분석: 옵션 가격 책정, 리스크 분석

    GPGPU 컴퓨팅의 등장은 슈퍼컴퓨팅의 민주화를 가져왔습니다. 이전에는 대형 연구 기관이나 기업만이 접근할 수 있었던 컴퓨팅 성능이 이제는 소비자용 하드웨어에서도 활용 가능하게 된 것입니다.

    하지만 이 시기의 GPGPU 프로그래밍은 여전히 상당히 전문적인 지식을 요구했고, 그래픽스 파이프라인과 분리되어 있었기 때문에 그래픽과 계산을 함께 사용하는 애플리케이션을 만들기가 복잡했습니다. 이 문제는 다음 단계인 컴퓨트 셰이더의 등장으로 해결됩니다.

     

    ※ 추가 설명 

    더보기

    "그래픽스 파이프라인과 분리되어 있었다"는 것은 초기 GPGPU(General-Purpose computing on Graphics Processing Units) 프로그래밍 방식이  기존의 그래픽 렌더링과 별개의 시스템으로 작동했다는 의미입니다. 

    그래픽스 파이프라인과 GPGPU의 분리 문제

    초기 GPGPU 구현(CUDA나 초기 OpenCL 등)에서는 다음과 같은 분리 문제가 있었습니다. 

    1. 다른 프로그래밍 모델과 API 사용

    그래픽스 렌더링은 DirectX나 OpenGL과 같은 그래픽 API를 통해 접근했지만, 일반 계산(GPGPU)은 CUDA나 초기 OpenCL과 같은 완전히 별도의 API와 프로그래밍 모델을 사용했습니다. 이것은 마치 같은 건물에 두 개의 다른 입구가 있고, 각 입구에서는 다른 언어를 사용해야 하는 것과 같았습니다.

    예를 들어, 게임을 개발한다고 가정해봅시다.

    • 그래픽 렌더링을 위해서는 OpenGL/DirectX 코드 작성
    • 물리 시뮬레이션을 위해서는 CUDA/OpenCL 코드 작성

    두 가지 다른 프로그래밍 방식을 사용해야 했고, 이 둘 사이의 통합이 매끄럽지 못했습니다.

    2. 자원 공유의 비효율성

    초기 GPGPU 시스템에서는 그래픽 렌더링과 계산 간에 데이터를 공유하는 과정이 복잡하고 비효율적이었습니다. 예를 들어

    1. GPU에서 물리 시뮬레이션을 CUDA로 계산
    2. 결과 데이터를 GPU 메모리에서 CPU 메모리로 복사
    3. 다시 CPU 메모리에서 GPU 메모리로 복사(그래픽 API 형식으로)
    4. OpenGL/DirectX로 화면에 렌더링

    이 과정에서 불필요한 데이터 복사가 발생했고, 이는 성능 저하의 주요 원인이었습니다.

    3. 동기화 문제

    그래픽 작업과 계산 작업 사이의 동기화도 문제였습니다. 그래픽 렌더링 중에 계산 작업을 실행하거나, 그 반대의 경우 적절한 동기화 메커니즘 없이는 데이터 경쟁 조건(race condition)이나 기타 타이밍 문제가 발생할 수 있었습니다.

    4. 리소스 경쟁

    GPU의 동일한 하드웨어 리소스(메모리 대역폭, 계산 유닛 등)를 두 개의 별도 시스템(그래픽스와 계산)이 경쟁적으로 사용했습니다. 이 두 시스템은 서로의 존재를 "인식"하지 못했기 때문에 리소스 사용 최적화가 어려웠습니다.

    비유를 통한 이해

    이 문제를 비유적으로 설명하자면:

    초기 GPGPU는 같은 공장 건물에 두 개의 완전히 분리된 생산 라인을 설치한 것과 같았습니다. 한 라인(그래픽스)은 화면에 표시될 이미지를 만들고, 다른 라인(GPGPU)은 일반 계산을 처리합니다. 두 라인 사이에서 제품이나 부품을 이동시키려면, 먼저 공장 밖으로 내보낸 다음 다른 입구로 다시 들여와야 했습니다.

    컴퓨트 셰이더의 등장 (2010-2014)

    2010년대 초반, 그래픽스 API는 중요한 발전을 이루었습니다. DirectX 11, OpenGL 4.3, 그리고 나중에 Apple의 Metal은 '컴퓨트 셰이더'라는 혁신적인 개념을 도입했습니다. 컴퓨트 셰이더는 GPGPU 컴퓨팅의 유연성과 기존 그래픽스 파이프라인과의 통합이라는 두 가지 장점을 모두 제공했습니다.

    컴퓨트 셰이더는 기존의 셰이더(정점, 픽셀, 기하 셰이더)와는 달리 그래픽스 파이프라인의 특정 단계에 묶여 있지 않았습니다. 대신, 개발자가 원하는 시점에 실행할 수 있었고, 텍스처와 버퍼에 자유롭게 접근할 수 있었습니다. 이는 그래픽스 파이프라인과 일반 계산 사이의 경계를 허물었습니다.

    컴퓨트 셰이더의 주요 특징은 다음과 같습니다.

    1. 워크 그룹(Work Group): 컴퓨트 셰이더는 '워크 그룹'이라는 단위로 조직된 스레드 그룹에서 실행됩니다. 각 워크 그룹 내의 스레드들은 서로 동기화되고 공유 메모리를 통해 통신할 수 있습니다.
    2. 공유 메모리(Shared Memory): 같은 워크 그룹 내의 스레드들은 고속의 공유 메모리를 통해 데이터를 교환할 수 있어, 복잡한 협력 알고리즘을 구현할 수 있습니다.
    3. 임의 메모리 접근(Random Memory Access): 컴퓨트 셰이더는 메모리 위치에 읽기와 쓰기 작업을 자유롭게 수행할 수 있어, 정렬, 검색, 데이터 압축 같은 알고리즘을 구현할 수 있습니다.
    4. 그래픽스 자원과의 통합(Integration with Graphics Resources): 컴퓨트 셰이더는 텍스처, 버퍼 등 그래픽스 자원에 직접 접근할 수 있어, 이미지 처리나 물리 기반 애니메이션 같은 작업을 효율적으로 수행할 수 있습니다.

    이 시기에는 또 다른 중요한 기술인 '테셀레이션(Tessellation)'도 도입되었습니다. 테셀레이션은 기본적으로 저해상도 메시를 실시간으로 더 높은 해상도로 세분화하는 기술입니다. 이는 두 개의 새로운 셰이더 단계로 구현되었습니다.

    1. Hull/Control 셰이더: 메시를 어떻게 세분화할지 결정합니다.
    2. Domain/Evaluation 셰이더: 세분화된 정점의 최종 위치를 계산합니다.

    테셀레이션은 적은 양의 데이터로도 매우 상세한 지형, 캐릭터, 물체를 렌더링할 수 있게 했습니다. 예를 들어, 카메라에 가까운 부분은 더 세밀하게 세분화하고, 먼 부분은 덜 세분화하여 메모리와 처리 능력을 효율적으로 사용할 수 있었습니다.

    컴퓨트 셰이더의 실제 적용 사례는 다양했습니다:

    • 이미지 처리: 블러, 선명화, HDR 톤 매핑 등의 후처리 효과
    • 입자 시뮬레이션: 수천, 수만 개의 입자를 동시에 시뮬레이션하여 불, 연기, 물, 폭발 등의 효과 구현
    • 물리 기반 애니메이션: 천, 머리카락, 풀 등의 자연스러운 움직임 계산
    • 지형 생성: 절차적 지형 생성 및 변형
    • 전역 조명: 광선 추적이나 광자 매핑과 같은 고급 조명 기법 구현

    이 시기에 등장한 게임들, 특히 Battlefield 4, Far Cry 3, Crysis 3 등은 이러한 새로운 기술을 활용하여 이전보다 훨씬 더 몰입감 있고 역동적인 게임 환경을 만들어냈습니다.

    물리 기반 렌더링과 고급 셰이더 (2013-2017)

    2013년경부터 게임 그래픽스 분야에서 '물리 기반 렌더링(Physically Based Rendering, PBR)'이 주류가 되기 시작했습니다. PBR은 실제 물리 법칙에 기반하여 빛과 재질 간의 상호작용을 모델링하는 접근 방식입니다.

    전통적인 셰이딩 모델은 종종 현실을 정확히 반영하지 못했고, 일관된 결과를 얻기 위해서는 아티스트들이 여러 환경 조건에서 수동으로 조정해야 했습니다. 반면에 PBR은 에너지 보존 법칙, 프레넬 효과(Fresnel effect), 미세면 이론(microfacet theory) 등의 물리 원리를 적용하여 다양한 조명 조건에서 일관되고 사실적인 결과를 제공합니다.

    PBR 셰이더의 주요 특징은 다음과 같습니다.

    1. 금속성(Metalness)과 거칠기(Roughness): PBR은 재질을 주로 이 두 가지 매개변수로 정의합니다. 금속성은 재질이 금속인지 비금속(유전체)인지를 결정하고, 거칠기는 표면이 얼마나 매끄럽거나 거친지를 결정합니다.
    2. 미세면 분포(Microfacet Distribution): 표면은 눈에 보이지 않는 작은 미세면들로 구성되어 있다고 가정합니다. 이 미세면들의 분포는 거칠기에 따라 달라지며, 이는 빛이 어떻게 반사되는지에 영향을 미칩니다.
    3. 에너지 보존(Energy Conservation): 표면에서 반사되는 빛의 양은 입사된 빛의 양을 초과할 수 없습니다. 이 원칙은 더 사실적인 렌더링을 가능하게 합니다.
    4. 이미지 기반 조명(Image-Based Lighting, IBL): 환경 맵을 사용하여 주변 환경으로부터의 간접 조명을 시뮬레이션합니다. 이는 특히 반사가 많은 재질(금속, 광택 있는 표면 등)에서 중요합니다.

    PBR의 도입은 게임 그래픽스의 품질을 크게 향상시켰습니다. Unreal Engine 4와 Unity 5는 2014-2015년경에 기본적으로 PBR 셰이더를 제공하기 시작했고, 이는 게임 개발자들이 더 쉽게 고품질 그래픽을 구현할 수 있게 했습니다.

    이 시기의 다른 중요한 발전은 '글로벌 일루미네이션(Global Illumination, GI)'의 실시간 구현이었습니다. 글로벌 일루미네이션은 직접 조명뿐만 아니라 표면 간의 빛 반사(간접 조명)까지 고려하는 렌더링 기법입니다. 전통적으로 GI는 계산 비용이 매우 높아 사전 계산된 라이트맵에만 의존했지만, 이 시기에는 SSAO(Screen Space Ambient Occlusion), SSGI(Screen Space Global Illumination), VXGI(Voxel-Based Global Illumination) 등의 기술을 통해 어느 정도 실시간으로 구현할 수 있게 되었습니다.

    또한 이 시기에는 '피지컬 카메라(Physical Camera)' 개념도 도입되었습니다. 이는 실제 카메라의 특성(노출, 조리개, 셔터 속도, 깊이감, 색 보정 등)을 시뮬레이션하여 더 영화적인 품질의 이미지를 만들어내는 기술입니다.

    이러한 발전을 보여주는 주목할 만한 게임으로는 'The Order: 1886', 'Until Dawn', 'Uncharted 4', 'Horizon Zero Dawn' 등이 있습니다. 이 게임들은 PBR, 고급 조명 기법, 그리고 정교한 후처리 효과를 통해 당시로서는 거의 사진에 가까운 수준의 그래픽을 선보였습니다.

    또한 이 시기에는 VR(가상 현실)의 부상으로 인해 셰이더 최적화가 더욱 중요해졌습니다. VR은 높은 해상도와 프레임 레이트를 요구하기 때문에, 개발자들은 시각적 품질을 유지하면서도 성능을 최적화하는 방법을 찾아야 했습니다.

    레이 트레이싱과 현대 셰이더 (2018-현재)

    2018년은 실시간 그래픽스에 있어 중요한 전환점이 된 해였습니다. NVIDIA는 RTX 기술을 탑재한 GeForce 20 시리즈 그래픽 카드를 출시했고, Microsoft는 DirectX 12에 DXR(DirectX Raytracing) API를 추가했습니다. 이로써 게임에서도 '레이 트레이싱(Ray Tracing)'이라는, 이전까지는 주로 영화 CG에서만 사용되던 렌더링 기법을 실시간으로 사용할 수 있게 되었습니다.

    레이 트레이싱은 빛의 물리적 행동을 시뮬레이션하는 렌더링 기법으로, 카메라에서 픽셀마다 광선(ray)을 쏘아 장면 내 객체와의 교차점을 찾고, 이 점에서 빛 소스까지 추가 광선을 쏘아 조명, 그림자, 반사, 굴절 등을 계산합니다.

    전통적인 래스터화 기반 렌더링은 효율적이지만 정확한 반사, 굴절, 그림자, 간접 조명 등을 계산하기 어려웠습니다. 레이 트레이싱은 이러한 효과를 훨씬 더 자연스럽게 구현할 수 있지만, 계산 비용이 매우 높습니다.

    RTX 기술은 레이 트레이싱을 가속화하기 위한 전용 하드웨어(RT 코어)를 제공했고, 이를 통해 제한된 범위에서 실시간 레이 트레이싱이 가능해졌습니다. 대부분의 게임은 완전한 레이 트레이싱이 아닌 '하이브리드 렌더링'을 사용했는데, 이는 기본적인 장면은 전통적인 래스터화 방식으로 렌더링하고, 반사, 그림자, 앰비언트 오클루전 등 특정 효과에만 레이 트레이싱을 적용하는 방식입니다.

    레이 트레이싱을 구현하기 위해 새로운 종류의 셰이더가 도입되었습니다:

    1. 레이 생성 셰이더(Ray Generation Shader): 광선의 원점과 방향을 결정합니다.
    2. 교차 셰이더(Intersection Shader): 광선과 장면 내 객체 간의 교차점을 계산합니다.
    3. 가장 가까운 히트 셰이더(Closest Hit Shader): 광선이 객체와 교차할 때 실행되며, 해당 점의 색상을 계산합니다.
    4. 미스 셰이더(Miss Shader): 광선이 어떤 객체와도 교차하지 않을 때 실행됩니다(예: 하늘색 계산).
    5. 호출 가능 셰이더(Callable Shader): 다른 셰이더에서 호출할 수 있는 재사용 가능한 셰이더 함수입니다.

    실시간 레이 트레이싱이 가능해지면서 게임에서도 영화 품질에 가까운 반사, 그림자, 글로벌 일루미네이션을 구현할 수 있게 되었습니다. 'Battlefield V', 'Control', 'Cyberpunk 2077', 'Metro Exodus Enhanced Edition' 등의 게임은 레이 트레이싱을 적극적으로 활용하여 이전 세대와는 확연히 다른 시각적 품질을 선보였습니다.

     

    하지만 레이 트레이싱은 계산 비용이 매우 높기 때문에, 이를 보완하기 위한 또 다른 중요한 기술이 등장했습니다. 바로 'DLSS(Deep Learning Super Sampling)'와 같은 AI 기반 업스케일링 기술입니다. DLSS는 딥러닝을 사용하여 낮은 해상도로 렌더링된 이미지를 고해상도로 업스케일링하는 기술로, 레이 트레이싱의 성능 부담을 상당 부분 상쇄시켜주었습니다.

    이 시기에는 '메시 셰이더(Mesh Shader)'라는 새로운 셰이더 유형도 도입되었습니다. DirectX 12 Ultimate와 Vulkan을 통해 사용할 수 있는 메시 셰이더는 기존의 정점 및 기하 셰이더를 대체하고, 3D 모델 처리 방식을 획기적으로 변화시켰습니다. 메시 셰이더는 더 유연하고 효율적인 방식으로 3D 기하를 생성하고 처리할 수 있으며, 특히 매우 상세한 장면이나 큰 오픈 월드 환경에서 유용합니다.

    AI와 셰이더의 융합 (2020-현재)

    최근 몇 년 동안, 인공지능 기술의 급속한 발전은 셰이더와 그래픽스 분야에도 큰 영향을 미쳤습니다. AI와 셰이더의 융합은 두 가지 주요 방향으로 진행되고 있습니다: AI를 활용한 그래픽스 향상과 AI를 활용한 셰이더 개발 및 최적화입니다.

    AI를 활용한 그래픽스 향상

    NVIDIA의 DLSS(Deep Learning Super Sampling)는 AI와 그래픽스의 융합을 보여주는 대표적인 예입니다. DLSS는 딥러닝 네트워크를 사용하여 낮은 해상도 이미지를 고해상도로 업스케일링합니다. 이 기술은 슈퍼컴퓨터에서 사전 학습된 AI 모델을 사용하여, 낮은 해상도에서 렌더링된 프레임을 분석하고 고해상도 이미지에서 어떻게 보일지 예측합니다.

    DLSS의 등장 이후, AMD도 FSR(FidelityFX Super Resolution)을 출시했습니다. FSR 2.0부터는 시간적 업스케일링을 활용하여 DLSS와 유사한 품질을 제공하기 시작했습니다. Intel도 XeSS(Xe Super Sampling)라는 자사의 업스케일링 기술을 개발했습니다.

    이러한 AI 기반 업스케일링 기술은 레이 트레이싱과 같은 컴퓨팅 집약적인 렌더링 기법을 더 실용적으로 만들었습니다. 게임은 이제 낮은 내부 해상도로 렌더링한 다음 AI를 사용하여 이를 고해상도로 업스케일링함으로써, 시각적 품질을 크게 희생하지 않으면서도 성능을 크게 향상시킬 수 있게 되었습니다.

    AI는 또한 노이즈 제거, 안티앨리어싱, 모션 블러 등 다양한 후처리 효과에도 적용되고 있습니다. 예를 들어, NVIDIA의 DLAA(Deep Learning Anti-Aliasing)는 딥러닝을 사용하여 고품질의 안티앨리어싱을 제공합니다.

    AI를 활용한 셰이더 개발 및 최적화

    AI는 셰이더 자체의 개발과 최적화에도 활용되고 있습니다. 연구자들과 개발자들은 AI를 사용하여 셰이더 코드를 자동으로 생성하거나 최적화하는 방법을 탐구하고 있습니다.

    NVIDIA의 GauGAN은 사용자의 간단한 스케치를 기반으로 사실적인 풍경 이미지를 생성할 수 있는 AI 기반 도구입니다. 이 기술은 생성적 적대 신경망(GAN)을 사용하여 셰이더가 구현하기 어려운 복잡한 자연 요소(나무, 물, 구름 등)를 사실적으로 생성합니다.

    또한 AI는 셰이더 퍼포먼스 예측 및 최적화에도 사용되고 있습니다. 게임 엔진은 AI 모델을 사용하여 특정 셰이더의 실행 시간을 예측하고, 이를 기반으로 자동으로 최적화 결정을 내릴 수 있습니다.

    Unity와 Unreal Engine과 같은 게임 엔진은 AI 기반 도구를 통합하여 개발자들이 더 쉽게 고품질 셰이더를 만들 수 있도록 지원하기 시작했습니다. 예를 들어, Unity의 Shader Graph와 Unreal Engine의 Material Editor는 점점 더 지능적인 기능을 추가하여 복잡한 셰이더 효과를 더 직관적으로 만들 수 있게 되었습니다.

    프로시저럴 생성(Procedural Generation) 분야에서도 AI와 셰이더의 결합이 활발히 이루어지고 있습니다. AI는 복잡한 패턴, 텍스처, 지형 등을 자동으로 생성하는 데 사용되며, 이를 셰이더와 결합하여 실시간으로 렌더링합니다.

    이러한 AI와 셰이더의 융합은 아직 초기 단계이지만, 미래에는 더욱 깊어질 것으로 예상됩니다. 특히 생성형 AI의 발전과 함께, 셰이더 프로그래밍 방식 자체가 근본적으로 변화할 가능성도 있습니다.

    셰이더의 미래: 범용 컴퓨팅의 핵심으로

    셰이더 기술은 끊임없이 진화하고 있으며, 앞으로도 컴퓨터 그래픽스와 범용 컴퓨팅의 미래를 형성하는 데 중요한 역할을 할 것입니다. 현재 진행 중이거나 가까운 미래에 예상되는 몇 가지 주요 동향을 살펴보겠습니다.

    패스 트레이싱과 실시간 전역 조명

    현재의 실시간 레이 트레이싱은 여전히 제한적이며, 주로 반사, 그림자, 앰비언트 오클루전 등 특정 효과에만 사용됩니다. 그러나 하드웨어 성능이 계속 향상됨에 따라, 더 완전한 형태의 레이 트레이싱인 '패스 트레이싱(Path Tracing)'이 게임에도 적용될 가능성이 높아지고 있습니다.

    패스 트레이싱은 빛이 장면 내에서 여러 번 반사되는 경로를 추적하여 더 정확한 전역 조명을 구현할 수 있습니다. 'Minecraft RTX'와 같은 일부 게임에서는 이미 패스 트레이싱을 실험적으로 도입하고 있습니다.

    Unreal Engine 5의 'Lumen'과 같은 기술은 하이브리드 접근 방식을 사용하여 대화형 전역 조명을 구현하고 있습니다. 이러한 기술은 계속 발전하여 더욱 정확하고 효율적인 조명 시뮬레이션을 가능하게 할 것입니다.

    프로시저럴 및 생성 콘텐츠

    셰이더는 프로시저럴 콘텐츠 생성에 있어 핵심적인 역할을 하고 있으며, 이 역할은 앞으로 더욱 확대될 것으로 예상됩니다. Unreal Engine 5의 'Nanite'와 같은 기술은 극도로 상세한 기하 정보를 효율적으로 처리할 수 있게 해주며, 이는 더 풍부하고 다양한 프로시저럴 환경을 가능하게 합니다.

    AI와 결합된 프로시저럴 생성 기술은 게임 개발자가 광활한 오픈 월드를 더 쉽게 만들 수 있게 해줄 것입니다. 셰이더는 이러한 자동 생성된 콘텐츠를 실시간으로 렌더링하고 상호작용하는 데 필수적입니다.

    신경망 렌더링

    신경망 렌더링(Neural Rendering)은 기존의 렌더링 기법과 딥러닝을 결합한 새로운 패러다임입니다. NVIDIA의 NeRF(Neural Radiance Fields)와 같은 기술은 2D 이미지 세트에서 3D 장면을 재구성하고 새로운 시점에서 렌더링할 수 있게 해줍니다.

    이러한 기술이 발전함에 따라, 전통적인 셰이더 프로그래밍은 신경망 가중치 학습 및 최적화와 결합될 가능성이 있습니다. 미래에는 셰이더 프로그래머가 직접 코드를 작성하는 대신, AI 시스템을 학습시켜 특정 시각 효과를 구현하는 방식으로 변화할 수도 있습니다.

    다양한 분야로의 확장

    셰이더 기술은 이미 게임과 시각 효과를 넘어 다양한 분야로 확장되고 있습니다.

    1. 과학 연구: 분자 동역학, 기상 예측, 유체 시뮬레이션 등 복잡한 과학적 계산을 가속화합니다.
    2. 의료 영상: CT, MRI 스캔의 3D 재구성 및 분석을 실시간으로 수행할 수 있게 해줍니다.
    3. 금융 모델링: 옵션 가격 책정, 리스크 분석 등의 복잡한 금융 계산을 가속화합니다.
    4. 인공지능: 신경망 학습 및 추론에서의 행렬 연산을 가속화합니다.
    5. 디지털 트윈: 물리적 시스템의 디지털 복제본을 실시간으로 시뮬레이션하고 시각화합니다.
    6. 확장 현실(XR): AR, VR, MR 등의 몰입형 경험을 위한 실시간 렌더링을 가능하게 합니다.

    이러한 다양한 응용 분야에서 셰이더 기술은 점점 더 중요해질 것이며, 하드웨어 제조사들도 이에 맞춰 셰이더 실행을 위한 특수 하드웨어를 계속 발전시킬 것입니다.

    새로운 하드웨어 아키텍처

    GPU 아키텍처도 계속 진화하고 있습니다. NVIDIA의 'Hopper' 아키텍처나 AMD의 'RDNA 3'와 같은 최신 GPU는 더 효율적인 셰이더 실행을 위한 새로운 기능을 도입하고 있습니다.

    또한 Apple의 M 시리즈 칩과 같은 통합 SoC(System on Chip) 설계는 CPU, GPU, 신경망 프로세서 등을 하나의 패키지로 통합하여 더 효율적인 데이터 처리를 가능하게 합니다.

    미래에는 양자 컴퓨팅, 뉴로모픽 컴퓨팅 등 완전히 새로운 컴퓨팅 패러다임이 등장할 수도 있으며, 이에 맞춰 셰이더 프로그래밍 모델도 적응하고 진화할 것입니다.

    표준화와 크로스 플랫폼

    Vulkan, WebGPU와 같은 표준은 다양한 플랫폼에서 일관된 셰이더 프로그래밍 경험을 제공하기 위해 계속 발전하고 있습니다. 특히 WebGPU는 웹 브라우저를 통해 고성능 그래픽스와 컴퓨팅에 접근할 수 있게 해주어, 셰이더 기술의 접근성을 크게 향상시킬 것으로 기대됩니다.

    이러한 표준화 노력은 셰이더 프로그래밍의 생태계를 더욱 풍부하게 만들고, 더 다양한 분야와 응용 프로그램에서 셰이더 기술이 활용될 수 있게 할 것입니다.

    셰이더, 그 이상의 의미

    셰이더는 단순히 그래픽을 계산하는 프로그램에서 출발하여 현대 컴퓨팅의 핵심 요소로 진화했습니다. 픽셀에 색을 입히는 단순한 프로그램에서 시작하여, 오늘날에는 사실적인 3D 세계를 만들고, 복잡한 물리 시뮬레이션을 실행하며, 인공지능을 가속화하는 강력한 도구가 되었습니다.

    셰이더의 역사는 컴퓨터 그래픽스와 병렬 컴퓨팅의 역사와 밀접하게 연결되어 있습니다. 각 세대의 셰이더 기술은 이전 세대의 한계를 극복하고, 새로운 가능성을 열어왔습니다. 고정 파이프라인에서 프로그래밍 가능한 셰이더로, 정점 및 픽셀 셰이더에서 컴퓨트 셰이더로, 그리고 이제는 레이 트레이싱 셰이더와 AI 가속 셰이더로의 진화는 지속적인 혁신의 여정이었습니다.

    댓글

Designed by Tistory.