Skip to content

Latest commit

 

History

History
80 lines (48 loc) · 5.21 KB

05-Rendering_pipeline.md

File metadata and controls

80 lines (48 loc) · 5.21 KB

r# Rendering pipeline

렌더링 파이프라인(rendering pipeline)은 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는 데 필요한 인련의 단계(stage)들 전체를 뜻한다.

  • 입력 조립기(IA) 단계
  • 정점 셰이더(VS) 단계
  • 덮개 셰이더(HS) 단계
  • 테셀레이터 단계
  • 영영 셰이더(DS) 단계
  • 기하 셰이더(GS) 단계
  • 스트림 출력(SO) 단계
  • 레스터화기(RS) 단계
  • 픽셀 셰이더(PS) 단계
  • 출력 병합기(OS) 단계

여기서 정점 셰이더, 픽셀 셰이더 단계는 프로그래밍이 가능한 영역이고(셰이더 프로그래밍), 나머지 단계는 하드웨어 고정단계로 DirectX 11 상에서 옵션을 통해 설정을 할 수 있다.


입력 조립기 단계

입력 조립기(input assembler, IA) 단계는 메모리에서 기하 자료(정점들과 색인들)를 읽어서 기하학적 기본도형(삼각형, 선분 등)을 조립한다.(간단히 말하면 색인들은 정점들을 어떤 식으로 조립해서 기본도형을 만들 것인지를 결정한다.)


정점 셰이더 단계

입력 조립기 단계에서 기본도형들을 조립한 후에는 정점들이 정점 셰이더 단계(vertex shader, VS)로 입력된다. 정점 셰이더를, 정점 하나를 받아서 정점 하나를 출력하는 함수로 간주해도 될 것이다. 화면에 그려질 모든 정점은 이 정점 셰이더를 거쳐 간다. 개념적으로는 하드웨어에서 다음과 같은 일이 일어난다고 생각할 수 있다.

for(unsigned int i = 0; i < numVertices; ++i)
  outputVertex[i] = VertexShader(inputVertex[i]);

정점 셰이더 함수의 구체적인 내용은 프로그래머가 구현해서 GPU에 제출한다. 그 함수는 각 정점에 대해 GPU에서 실행되기 때문에 아주 빠르다.

변환, 조명, 변위 매핑 등 수많은 특수 효과를 정점 셰이더에서 수행할 수 있다. 정점 셰이더에서 입력 정점 자료는 물론 텍스처라든가 변환 행렬, 장면 관원 정보 등 GPU 메모리에 담긴 다른 자료에도 접근할 수 있다.


테셀레이션 단계

테셀레이션(tessellation)이란 한 메시의 삼각형들을 더 잘게 쪼개서 새로운 삼각형들을 만드는 과정을 말한다. 그러한 새 삼각형들을 새로운 위치로 이동함으로써 좀 더 세밀한 메시를 만들어 낼 수 있다.

DirectX 11 새롭게 추가된 테셀레이션 단계들은 GPU에서 기하구조를 테셀레이션 하는 수단을 제공한다. DirectX 11 이전에는 어던 형태로든 테셀레이션을 구현하려면 CPU에서 삼각형들을 분할해서 새 기하구조를 만들고 그것을 다시 GPU에 올려서 렌더링해야 했다. 그러나 이것은 느린 연산이며, 부담이 된다. DirectX 11은 테셀레이션을 전적으로 하드웨어, 즉 DirectX 11 대응 장치에서 수행하도록 하는 API를 제공한다. 테셀레이션은 생략 가능한 단계이다.


기하 셰이더 단계 / 스트림 출력 단계

기하 셰이더(geometry shader, GS) 단계는 생략가능한 단계다. 기하 셰이더는 하나의 온전한 기본도형을 입력받아서 임의로 번형한다. 예를 들어 기하 셰이더는 기본도형을 다른 여러 기본도형들로 확장할 수도 잇고, 특정 조건에 따라서는 입력된 기본도형을 출력하지 않고 폐기할 수도 있다.

그리고 기하 셰이더의 출력 정점 자료를 스트림 출력 단계를 통해 메모리의 버퍼에 저장해 두고 나중에 활용하는 것이 가능하다.


래스터화기 단계

래스터화 단계(rasterization stage)라고도 하는 래스터화기 단계(rasterizer stage)의 주 임무는 투영된 3차원 삼각형으로부터 픽셀 색상들을 계산해내는 것이다.

  • 클리핑(clipping)
  • 원근 나눗셈(perspective division)
  • 뒷면 제거(back-face culling)
  • 뷰포트 변환(viewport transform)
  • 스캔 변환(scan conversion)

픽셀 셰이더 단계

픽셀 셰이더(pixel shader, PS)는 프로그래머가 작성해서 GPU에서 실행하는 프로그램이다.

픽셀 쎼이더는 각각의 픽셀 단편(pixel fragment)마다 실행된다. 기본적으로 픽셀 셰이더는 보간된 정점 특성들을 입력받아서 하나의 색상을 출력한다. 픽셀 셰이더는 그냥 고정된 상수 색상을 돌려주는 아주 간단한 형태에서부터 픽셀별 조명이나 반사, 그림자 효과를 수행하는 등의 좀 더 복잡한 형태까지 다양한다.


출력 병합기 단계

픽셀 셰이더가 생성한 픽셀 단편들은 렌더링 파이프라인의 출력 병합기(output merger, OM) 단계로 입로 입력된다. 출력 병합기 단계에서 일부 픽셀 단편들이 깊이 판정이나 스텐실 판정에 의해 폐기된다. 폐기되지 않은 픽셀 단편은 후면 버퍼에 기록된다. 혼합(blending)도 이 단계에서 일어난다. blending이란 새 픽셀이 후면 버퍼의 기존 픽셀을 완전히 덮어 쓰는 것이 아니라 두 픽셀을 일정한 공식에 따라 혼합한 결과를 기록하는 것을 말한다. blending은 반투명 같은 특수 효과를 내는 데 쓰인다.