5.1 3차원의 환상

  • 렌더링 파이프라인 : 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는데 필요한 일련의 단계
  • 물체겹침 : 불투명한 물체가 그 뒤에 있는 물체 일부 or 전체 가림

5.2 모형의 표현

  • 일반적으로 "D3D" 에서는 고형(solid)의 3차원 물체를 삼각형 메시로 근사("approximation")해서 표현
    • 삼각형 메시의 증가 = 처리량 증가
    • 선이나 점도 물체를 근사하는데 유용

5.3 컴퓨터 색상의 기본 ㅐ념

  • 기본적으로 빛의 세기 "RGB" 값을 사용
    • 일반적으로 0 ~ 1 사이 값
    • 0 은 빛이 전혀 없음, 1은 빛의 세기가 최대

5.3.1 색상 연산

  • 벡터의 덧셈과 스칼라 곱셈은 색상 변화에 영향을 끼친다
  • 내적, 외적 연산은 색상 벡터에 별로 의미가 없다
    • 내적은 스칼라 값이 결과이기에 색상 값에 영향x
    • 외적은 색상 공간에서 의미없는 방향이기에 영향x
  • 변조(modulation) : 성분별 곱셈(componentwise multiplication)
    • $(c_r, c_g, c_b)\odot (k_r, k_g, k_b) = (c_r k_r, c_g k_g, c_b k_b)$
    • 적색광 50%, 녹생광 75%, 청색광 25% 반사
      • $(r, g, b)\odot (0.5, 0.75, 0.25) = (0.5r, 0.75g, 0.25b)$
  • 한정(clamping) : 특정 구간을 벗어나지 않게 보정하는 것
    • 덧셈 연산으로 값이 벗어나면 [0, 1] 구간 내로 보정

5.3.2 128비트 색상

  • 하나의 색상을 표현하는데 128비트 (알파 값 포함)(4차원 벡터)
    • 각 성분을 32비트 부동 소수점 값 하나로 표현
    • XMVECTOR 형식 사용
    • XMVECTOR XM_CALLCONV XMColorModulate( //Returns c1 ⊗ c2 FXMVECTOR C1, FXMVECTOR C2);
    • 정밀도가 높은 색상 연산이 필요한 곳 (픽셀 셰이더 등)에 사용
      • 유효 자릿수가 많기 떄문

5.3.3 32비트 색상

  • 하나의 색상을 표현하는데 32비트 (알파 값 포함)(4차원 벡터)
    • 각 성분을 8비트 정수
    • XMCOLOR 형식 사용 : <DirectXPackedVector.h> 필요
      • [0, 255] :
        • 실수값 구간[0, 1]로 사상함으로써 32비트 색상 128비트 변환 가능
        • 32비트 -> 128비트 색상 변환 메서드 (ARGB 형식 사용)
        • XMVECTOR XM_CALLCONV PackedVector::XMLoadColor( const XMCOLOR* pSource);
        • XMVector -> XMColor 변환 메서드
        • void XM_CALLCONV PackedVector::XMStoreColor( XMCOLOR* pDestination, FXMVECTOR V)
    • 일반적으로 후면 버퍼에 최종 픽셀 색상은 32비트
      • 32bit가 메모리 및 파워 적게 사용
      • 32bit 색상 맞춤의 GPU 및 SW가 대중적
      • 사람 눈에 32bit 색상으로 충분

5.4 렌더링 파이프라인 개요

    • OM(출력 병합기) 단계 : 후면 버퍼, 깊이-스텐실 버퍼 같은 텍스처에 자료 기록
      • 양방향인 이유 -> GPU자원을 읽기도 하고 쓰기도 함을 뜻함
    • 필수 단계 목록
      • IA, VS, RS, PS, OM

5.5 입력 조립기 단계(IA)

  • 메모리에서 기하 자료(정점들과 색인들)을 읽어서 기하학적 기본도형(primitive; 삼각형, 선분, 점 등, 더 복잡한 형태 만드는 데 사용 가능한 기본도형)을 조립하는 단계

5.5.1 정점 (Vertex)

  • 3D 모델을 구성하는 기본 단위
  • 공간적 위치 이외의 정보도 담을 수 있음
    • 조명 구현을 위한 법선 벡터 추가
    • 텍스처 적용을 위한 텍스처 좌표 추가
    • "D3D"에서는 정점 형식을 정의할 수 있는 유연성 제공

5.5.2 기본도형 위상구조

  • 정점 버퍼(Vertex Buffer) : 정점을 담은 버퍼로 정점들은 여기에 담겨 렌더링 파이프라인에 묶임
  • 기본도형 위상구조(primitive toplogy)를 설정해야 함
    • 정점 버퍼에 어떻게 도형을 형성하는 지에 대한 정보가 없기 때문
    • 위상구조 설정 메서드와 관련된 열거형
        ID3D12GraphicsCommandList::IASetPrimitiveTopology( 
            D3D_PRIMITIVE_TOPOLOGY Topology);
        typedef enum D3D_PRIMITIVE_TOPOLOGY
        {
            D3D_PRIMITIVE_TOPOLOGY_UNDEFINED = 0,
            D3D_PRIMITIVE_TOPOLOGY_POINTLIST = 1,
            D3D_PRIMITIVE_TOPOLOGY_LINELIST = 2,
            D3D_PRIMITIVE_TOPOLOGY_LINESTRIP = 3,
            D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4,
            D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5,
            D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ = 10,
            D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ = 11,
            D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ = 12,
            D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ = 13, 
            D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST 
            = 33,
            D3D_PRIMITIVE_TOPOLOGY_2_CONTROL_POINT_PATCHLIST 
            = 34,
            .
            .
            .
            D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST 
            = 64,
        } D3D_PRIMITIVE_TOPOLOGY;
      • POINTLIST : 모든 정점은 개별적인 점을 그려짐
      • LINESTRIP : 차례로 연결된 선분 형성 (N + 1개 정점 = N개 선분)
      • LINELIST : 2개씩 연결된 선분 형성 (2N개 정점 = N개 선분)
      • TRIANGLESTRIP : 삼각형 띠 설정; 짝수 번쨰, 홀수 번째 삼각형 정점들이 감기는 순서가 다름 (N개 정점 = N-2개 삼각형)
        • 후면 선별 시 문제가 됨 <- GPU가 내부적으로 짝수 번쨰 삼각형의 처음 두 정점 순서를 바꿔 홀수 번쨰와 같은 순서가 되게 해서 해결
      • TRIANGLELIST : 정점 3개가 1개의 떨어진 삼각형 형성 (3N 정점 = N 삼각형)
      • 인접성(Adjacency) 정보를 가진 기본도형
        • 각 삼각형에 그에 접한 이웃 삼각형 3 개에 관한 정보 포함
        • 인접 삼각형에 접근해야 하는 특정 기하 셰이딩 알고리즘에 사용
          • 기하 셰이더의 입력으로 만 사용, 실제 그려지는 것은 X
        • "ADJ"가 뒤에 붙은 타입
      • PATCHLIST : 위상구조는 정점 자료를 N개의 제어점들로 이루어진 패치 목록으로 해석해야 함; 테셀레이션 단계들에 사용

5.5.3 색인(Index)

  • 삼각형 목록에서 정점을 제거하는 방법을 고안한 것
  • 색인을 이용하는 정점 목록과 함꼐 색인 목록을 만듦
    • 정점 목록 : 고유한 정점들로만 구성
    • 색인 목록 : 어떤 정점들을 어떤 순서로 사용해서 삼각형 형성해야 하는지를 나타내는 색인
    • Vertex v[4] {v0,v1,v2,v3}; UINT indexList[6] {0,1,2,0,2,3};
  • 색인 목록은 단순 정수이므로 메모리 소모 적음
  • 정점들이 적절한 순서로 캐시에 저장되면, GPU는 중복 정점을 자주 처리할 필요X

5.6 정점 셰이더 단계(Vertex Shader)

  • 각 정점의 위치와 속성을 처리하여 3D 공간에서 화면 공간으로 변환하는 단계
  • 화면에 그려질 모든 정점은 정점 셰이더를 거쳐 감
  • 구체적인 내용은 프로그래머가 구현해서 GPU에 제출
    • 각 정점에 대해 GPU에서 실행되기 떄문에 빠름
  • GPU 메모리에 담긴 다른 자료에 접근 가능
  • 객체의 정점을 처리하여 동차 절단 공간(Homogeneous Clipping Space)으로 변환
  • 일반적으로 클립좌표(동차 절단 좌표; 투영 행렬 거쳐 변환된 좌표)를 내보냄.
  • 월드 좌표 및 뷰 좌표가 필요하면, 사용자 정의로 추가로 저장

5.6.1 국소 공간과 세계 공간

  • 세계 공간(world space) : 물체의 기하구조를 장면 전역의 좌표게를 기준으로 직접 구축
  • 국소 공간(local space) : 물체 자신의 국소 좌표계를 기준으로 구축
  • 세계 변환(world transform) : 국소 좌표계에 상대적인 좌표를 전역 장면 좌표계에 상대적인 좌표로 바꾸는 것
  • 세계 행렬(world matrix) : 세계 변환 행렬
  • 모형을 local space에 정의하는 것에 대한 장점
    • 일반적으로 local 좌표계에서는 물체 중심이 원점과 일치; 주축 중 하나에 대칭;
    • 여러 장면에 재사용 될 때, 물체 좌표를 특정 장면을 기준으로 고정시키는 것은 비합리적;
      local 좌표계를 기준으로 좌표 저장 후, world space로 변환하는 변경 행렬을 정희해서 적용하는 것이 나음
    • 인스턴스마다 물체의 정점 및 색인 자료를 중복해서 지정하면 낭비 심함;
      local 좌표계 기준으로 한 기하구조의 복사본을 두고 개별 인스턴스마다 world matrix를 다르설정해서 그리는 것이 효율적; (인스턴싱)
  • $$
    W = \begin{vmatrix} u_x & u_y & u_z & 0 \ v_x & v_y & v_z & 0 \ w_x & w_y & w_z & 0 \ Q_x & Q_y & Q_z & 1 \end{vmatrix}
    $$
    • W 에 S(scale)R(rotation)T(translate)를 곱하여 localspace -> world space로 변경
      • W = SRT

5.6.2 시야 공간

  • 가상 카메라에 local 좌표계를 부여 할 떄, 좌표계는 시점 공간(eye space), 카메라 공간(camera space)라고도 하는 시야 공간(view space)을 정의한다
  • 카메라는 시야 공간의 원점에 놓여서 양의 z축을 바라봄
    • x축은 카메라 우측, y 축은 카메라 위
  • 렌더링 파이프라인의 후반부 단계들에서는 장면의 정점들을 world space가 아닌 view space를 기준으로 서술하는 것이 편한 경우가 있음
  • 시야 변환(view transform) : world space -> view space 좌표 변환
    • 시야 행렬(view matrix) : 시야 변환 행렬
  • 일반적으로 world 좌표계와 view 좌표계는 RT만 다르기에
    • $V = W^{-1} = (RT)^{-1} = T^{-1}R^{-1}=T^{-1}R^{T}$
    • $$
      V = \begin{vmatrix} u_x & v_x & w_x & 0 \ u_y & v_y & w_y & 0 \ u_z & v_z & w_z & 0 \ -Q \cdot u & -Q \cdot v & -Q \cdot w & 1 \end{vmatrix}
      $$
  • 직관적으로 구하는 방법
    • Q : 카메라 위치; T : 카메라가 바라보는 지점; j : world space y축(상향벡터)
    • $w = \frac{T - Q}{||T-Q||}$
    • $u = \frac{j \times w}{||j \times w||}$
    • $v = w \times u$
  • view matrix 계산 함수
    • XMMatrixLookAtLH
      XMMATRIX XM_CALLCONV XMMatrixLookAtLH( // 시야 행렬 v를 출력
          FXMVECTOR EyePosition,             // 입력 카메라 위치 Q
          FXMVECTOR FoucusPosition,             // 입력 대상 점 T
          FXMVECTOR UpDirection,             // 입력 세계 상향 벡터 j
          )

5.6.3 투영과 동차 절단 공간

  • 카메라에 보이는 공간은 절두체(frustum; 각뿔대) 로 정의 됨
  • 3차원 장면을 2차원 이미지로 표현하려면, 절두체 안의 3차원 기하구조를 2차원 투영 창으로 투영(projection)
  • 투영 방식은 반드시 하나의 소실점으로 수렴하는 방식, 깊이가 증가함에 따라 투영크기가 감소하는 방식
  • 정점의 투영선(line of projection) :3차원 기하 구조의 한 정점에서 시점으로의 직선

5.6.3.1 절두체의 정의

  • 절두체(Frustum) :
    • 원근 투영에서 사용되는 두 개의 평행한 평면으로 잘린 피라미드 모양의 공간
  • 투영 중심에서 양의 z 축을 바라보는 시야 절두체 4가지 수량
    • n : 원점과 가까운 평면 사이 거리 (z축 상 거리)
    • f : 먼 평면 사이의 거리 (z축 상 거리)
    • a : 수직 시야각
    • b : 수평 시야각
    • r : 종횡비 (w/h)(후면 버퍼 종횡비)
  • 투영 창은 후면 버퍼에 사상되므로, 종횡비를 후면 버퍼의 종횡비와 일치시키는 것이 좋음
    • 일치하지 않으면, "비균등 비례"를 적용 (이미지 왜곡됨)
  • $$
    h=2 일 떄, r = \frac{w}{h} = \frac{w}{2} => w = 2r
    $$
  • $$
    \tan{(\frac{\alpha}{2})} = \frac{1}{d} => d = \cot{(\frac{\alpha}{2})}
    $$
  • $$
    \tan{(\frac{\beta}{2})} = \frac{r}{d} = \frac{r}{\cot{(\frac{\alpha}{2})}} = r \cdot \tan{(\frac{\alpha}{2})}
    $$
  • $$
    \beta = 2 \tan^{-1}{(r \cdot \tan{(\frac{\alpha}{2})})}
    $$

5.6.3.2 정점의 투영

  • 점 (x, y, z)를 z = d 평면에 투영한 점 (x', y', d)를 구할려면,
    • $$
      \frac{x'}{d} = \frac{x}{z} => x' = \frac{xd}{z} = \frac{x \cot{\alpha / 2}}{z} = \frac{x}{z \tan{(\alpha/2)}}
      $$
    • $$
      \frac{y'}{d} = \frac{y}{z} => y' = \frac{yd}{z} = \frac{y \cot{\alpha / 2}}{z} = \frac{y}{z \tan{(\alpha/2)}}
      $$
    • 절두체 안에 있을 필요 충분 조건, $-r<=x'<=r;; -1<=y'<=1;; n<=z<=f;$

5.6.3.3 정규화된 장치 좌표(NDC) <- VS단계X 원근 나누기 단계

  • 종횡비에 대한 의존성을 없애기
    • -r <= x' <= r => -1 <= x'/r <= 1
    • [-r, r] 구간에서 [-1, 1]로 비례하는 것
  • 정규화된 좌표(normalized device coodrdinates, NDC) : 종횡비에 대한 의존성을 없앤 좌표
  • NCD 공간으로의 이러한 변화를 일종의 단위 변환(unit conversion)으로 볼 수도 있음
  • 원근 나누기(Perspective Division) :
    • 아래와 같이 원근 투영한 좌표를 NDC 좌표로 변환하는 것
  • x 축에서 NDC의 한 단위는 시야 공간의 r 단위와 같음 (1 ndc = r vs)
    • $x,vs \cdot \frac{1,ndc}{r,vs} = \frac{x}{r} ndc$
  • $$x' = \frac{xd}{z} = \frac{x}{rz \tan{(\alpha/2)}}$$
  • $$y' = \frac{yd}{z} = \frac{y}{z \tan{(\alpha/2)}}$$
  • 하드웨어는 종횡비에 대해 몰라도 됨

5.6.3.4 투영 변환을 NDC행렬로 표현

  • 일관성을 위해 투영 변환을 행렬로 표현하는 것이 바람직
  • 식을 선형인 부분과 비선형인 부분으로 나눠서 비선형 식 해결
    • z로 나누기가 비선형 부분
    • 투영 변환 전에 z 성분을 저장해야함 (정규화 시, z 성분도 정규화 되므로)
      • 동차 좌표 w 성분에 입력 (행렬 관점 [2][3] 성분을 1, [3][3] 성분을 0)
  • $$
    P = \begin{vmatrix}
    \frac{1}{r \tan{(\alpha/2)}} & 0 & 0 & 0 \
    0 & \frac{1}{r \tan{(\alpha/2)}} & 0 & 0 \
    0 & 0 & A & 1 \
    0 & 0 & B & 0
    \end{vmatrix} = \begin{vmatrix} \frac{x}{r \tan{(\alpha/2)}}, & \frac{y}{r \tan{(\alpha/2)}}, & Az + B, & z \end{vmatrix}
    $$
  • w = z로 나눠서 NDC 투영변환 완료
    • $$
      \begin{vmatrix} \frac{x}{rz \tan{(\alpha/2)}}, & \frac{y}{rz \tan{(\alpha/2)}}, & A + \frac{B}{z}, & 1 \end{vmatrix}
      $$

5.6.3.5 정규화된 깊이 값

  • 깊이 버퍼링 알고리즘을 위해 3차원 깊이 정보 필요
  • 깊이 성분의 정규화 구간은 [0, 1]
  • [n, f]를 구간 [0, 1]로 사상하는 함수 g(z)는 순서를 보존하는 함수여야 함
  • $g(z) = A + \frac{B}{z}$
    • 조건 1 : g(z) = A + B /n = 0 (가까운 평면이 0으로 사상)
    • 조건 2 : g(z) = A + B /f = 1 (가까운 평면이 1로 사상)
  • 조건에 맞춘 함수 g(z)는 다음과 같음
    • $g(z) = \frac{f}{f-n}-\frac{nf}{(f-n)z}$
    • 이 함수는 순증가(striclty increasing) 함수 이자 비선형 함수
      • 순서 보존 함수
      • 가까운 평면에 근접한 값들이 대부분을 차지
      • 가까운 평면과 먼 평면을 최대한 가깝게 해서 깊이 정밀도 문제 최소화
  • A와 B에 대한 원근투영 행렬
    • $$
      P = \begin{vmatrix}
      \frac{1}{r \tan{(\alpha/2)}} & 0 & 0 & 0 \
      0 & \frac{1}{r \tan{(\alpha/2)}} & 0 & 0 \
      0 & 0 & \frac{f}{f-n} & 1 \
      0 & 0 & \frac{-nf}{f-n} & 0
      \end{vmatrix}
      $$

5.6.3.6 XMMatrixPerspectiveFovLH 함수

  • FOV : 카메라의 시야각을 정의하는 값, 얼마나 넓은 범위를 볼 수 있는 지
    • 수직(FOVy) 또는 수평(FOVx)각도로 정의
      • d3d 에서는 수직(FOVy) 각도를 기준으로 사용 (수평각은 종횡비 계산으로 사용)
    • FOV는 절두체의 모양을 결정하는 데 영향
      • Y 각도가 커지면 절두체의 Y크기가 커지는데, 종횡비에 맞춰서 X 각도도 커지기에 종횡비는 변하지 않는다. → 절두체의 크기가 커졌기에, 물체는 작아져 보인다.
  • 원근투영 행렬 구축 함수
    // 투영 행렬 반환
    XMMATRIX XM_CALLCONV XMMatrixPerspctiveFovLH(
        float FovAngleY   // 수직 시야각(라디안)
        float Aspect,     // 종회비 = 너비 / 높이
        float NearZ,      // 가까운 평면 거리
        float FarZ        // 먼 평면 거리
    )
    ```    ```cpp
    // 투영 행렬 반환
    XMMATRIX XM_CALLCONV XMMatrixPerspctiveFovLH(
        float FovAngleY   // 수직 시야각(라디안)
        float Aspect,     // 종회비 = 너비 / 높이
        float NearZ,      // 가까운 평면 거리
        float FarZ        // 먼 평면 거리
    )

5.7 테셀레이션 단계들

  • 선택적 단계
  • 테셀레이션(Tessellation) :
    • 주어진 메시의 삼각형들을 더 잘게 쪼개서 새로운 삼각형들을 만드는 과정
    • 새 삼각형을 새로운 위치로 이동 함으로써, 원래 메시에는 없는 세부적인 특징을 만들어 냄
  • 장점
    • 카메라에 가까운 삼각형들에는 테셀레이션을 적용해서 세부도 향상, 먼 삼각형에는 적용하지 않는 방식의 세부수준(level-of-detail, LOD) 메커니즘 구현 가능
    • 메모리에는 저다각형(low-poly) 메시를 담고 즉석에서 메시를 추가함으로써 메모리 절약
    • 애니메이션이나 물리 처리 같은 연산들은 low-poly에서 수행, 테셀레이션된 고다각형 메시는 렌더링에만 사용 (계산량 줄이기)
  • D3D11 부터 추가 된, 기하구조를 GPU에서 테셀레이션하는 수단 제공

5.8 기하 셰이더 단계

  • 선택적 단계
  • 기하 셰이더 단계(Geometry Shader) :
    • 하나의 온전한 기본 도형을 입력받아서 임의로 변형
    • 정점 셰이더의 처리를 거친 정점을 입력 받음
    • 입력 받은 기본 도형을 바탕으로 새로운 도형 생성, 파괴
      • 점이나 선분을 사각형으로 확장
    • 기하 셰이더에서 출력된 정점 위치들은 반드시 동차 절단 공간으로 변환된 것이어야 함
  • 장점
    • 기하구조를 GPU에서 생성하거나 파괴 가능
    • 스트림 출력 단계를 통해 메모리의 버퍼에 저장해 두고 나중에 활용 가능

5.9 절단

  • 절단 (clipping) :
    • 완전히 시야 절두체 바깥에 있는 기하구조는 폐기, 절두체의 경계면과 교차하는 기하구조는 절두체 내부의 것만 남도록 잘라내는 것
    • 볼록 도형 절단 시, 볼록 도형이 남음
    • 삼각형을 절단할 시, 사각형이 되므로 삼각화 연산 필요
    • 하드웨어가 수행해 줌
      • 서덜런드-호지먼 절단 알고리즘 참고
  • 4차원 점 (x,y,z,w)가 시야 절두체 안에 있을려면 다음 조건 만족
    • -w <= x <= w; -w <= y <= w; 0 <= z <= w
      • 왼쪽 평면 : w = -x; 오른쪽 평면 : w = x; 아래 평면 w = -y;
      • 위 평면 : w = y; 가까운 평면 : z = 0; 먼 평면 : z = w;

5.10 래스터화 단계(resterization sate)

  • 투영된 3차원 삼각형으로부터 픽셀 색상들을 계산

5.10.1 뷰포트 변환

  • 절단 후, 하드웨어는 원근 나누기를 수행해서 동차 절단 공간 좌표를 장치 좌표(NDC)로 변환할 수 있음
  • 정점들이 NDC 공간으로 들어오면, 2차원 이미지 형성 점들의 2차원 x,y 좌표성분들이 후면 버퍼의 한 직사각형 영역으로 변환 (뷰포트)
  • 뷰포트 변환 시, z 성분 변하지 않음
    • 선형 변환이기에 왜곡되지 않았다는 것이지 [0,1]구간으로 값 자체는 선형 매핑으로 변함
    • D3D12_VIEWPORT 구조체의 MinDepth, MaxDepth 변경으로 깊이 값에 영향 미칠 수 있음 <- 반드시 [0, 1] 구간

5.10.2 후면 선별

  • 삼각형 정점들이 $v_0, v_1, v_2$ 순서로 감길 때, 삼각형의 법선 n은 다음과 같이 정의
    • $e_0 = v_1 - v_0$, $e_1 = v_2-v_0$, $n=\frac{e_0 \times e_1}{e_0 \times e_1}$
    • 이 법선이 가리키는 방향이 삼각형의 앞쪽(front side), 반대는 **뒤쪽(back side)
  • 관찰자에게 보이는 면이 앞쪽이면 전면(front-facing), 뒤쪽이면 후면(back-facing)
    • D3D에서는 기본적으로 "전면 = 시계 방향", "후면 = 반시계 방향" 간주
  • 후면 선별(backface culling) : 카메라에 보이지 않는 후면 삼각형을 골라서 폐기하는 것

5.10.3 정점 특성의 보간

  • 뷰포트 변환 후에 정점의 특성(색상, 법선 벡터, 텍스처 좌표)들을 삼각형을 덮는 각 픽셀에 대해 보간해야 함
  • 정점의 깊이 값도 보간하여, 각 픽셀에 깊이 버퍼링 알고리즘을 위한 깊이 값 부여 필요
  • 정점 특성들은 3차원 공간에서 삼각형의 면을 따라 선형으로 보간
    • 그대로 화면 공간에 사상하면 간격이 고르지 않음
  • 원근 보정 보간은 하드웨어가 수행하는 것으로 세부 사항 숙지 필요 x
    • [Everly01]에 수학적 유도 과정있음
  • 3차원 공간에서 균등한 분할은 화면 공간(2차원) 투영 시 유지x
    • 3차원 공간에서 선형 보간을 위해서는 화면 공간에서 비선형 보간 수행

5.11 픽셀 셰이더 단계

  • 선택적 단계
  • 색상 출력 단계
  • 픽셀 셰이더(pixel shader) :
    • 프로그래머가 작성하고 GPU가 실행하는 프로그램
    • 각각의 픽셀 단편(pixel fragment)에 대해 실행
    • 보간된 정점 특성들을 입력받아서 하나의 색상 출력
    • 고정된 상수 색 반환, 픽셀 당 조명, 반사 ,그림자 효과 등 수행

5.12 출력 병합기 단계

  • PS 가 생성한 픽셀 단편들을 입력으로 받음
    • 일부 픽셀 단편들이 기각될 수 있음 (깊이 판정, 스텐실 판정에 의해)
    • 기각되지 않은 픽셀 단편드을 후면 버퍼에 기록
  • 혼합(blending)이 일어나는 단계
    • 새 픽셀이 후면 버퍼의 기존 픽셀을 완전히 덮어쓰는 것이 아니라 일정 공식에 따라 섞은 결과를 기혹하는 것
    • 반투명 특수 효과에 사용

+ Recent posts

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });