모델링
좌표 변환
TRS 매트릭스
Basis
orthonormal ( basis ) : local space의 각 dimension축(basis) 이 독립적인지 ( 직교인지 ) x 각 dimension축시 단위벡터인지 여부
standard : local space의 각 dimension축이 기준 직교좌표계의 축과 일치하는지 여부
렌더링
렌더링 파이프라인
IM → VS → RS → FS(PS) → OM ( shader = program at GPU )
VS ( vertex shader )
- view transform
world space → eye(camera)의 location & 3dimension space를 통해 camera space로 변환 {u, v, n, EYE}
[Eye] = 카메라pos, At = 카메라가 보는 dir → [n], Up X n = u, u X n = [v] - projection transform
- view transform
world space → eye(camera)의 location & 3dimension space를 통해 camera space로 변환 {u, v, n, EYE}
[Eye] = 카메라pos, At = 카메라가 보는 dir → [n], Up X n = u, u X n = [v] - projection transform
- view transform
world space → eye(camera)의 location & 3dimension space를 통해 camera space로 변환 {u, v, n, EYE}
[Eye] = 카메라pos, At = 카메라가 보는 dir → [n], Up X n = u, u X n = [v]
- view transform
- view transform
중간 전달 과정
vertex array
attribute
- position ( object space )
- color
- texture coordination ( uv mapping )
caculated
- normal ( 자신을 포함한 polygon들의 normal 평균 )
- tangent space ( tangent + bitangent )
index array
attribute
- index in vertexarray
Polygon
attribute
- normal
- index array
calculated
- normal ( position of vertexes )
Rasterizer
클리핑, 원근 나눗셈, 뒷면제거, 뷰포트 변환, 스캔 전환
클리핑 clipping
- view frustum(절두체)에 걸치는 object를 clipping ( 절단면 반영하여 GPU가 오브젝트 재구성 )
원근 나눗셈 perspective division
뒷면 제거 back face culling
뷰포트 변환 viewport transform
- NDC(Normalized Device Coordinate) → 뷰포트(VPT)
- 기준점을 중심에서 모서리로 옮김 ( 언리얼은 좌상단이 0, 0, 우하단이 1, 1 / [0, 1] 정규화 )
스캔 전환 scan conversion
- 뷰포트(VPT) → Screen Space ( UV 2차원 공간 )
- pixel을 기준으로 fragment를 생성하여 각 fragment의 attribute는 자신을 포함하는 poligon의 vertex들의 attribute를 보간하여 적용
- dx12의 multi 머시기는 x4배수
- color, normal, tangent 등
프래그먼트 셰이더
- 라이팅 / 텍스쳐링
텍스쳐링
- 텍스쳐는 texel들로 구성
- rasterize단계에서 보간된 attribute에 따라, 각 fragment가 참조할 texel coord를 판단
표면 파라미터화 surface parameterization
- UV 매핑
- 패치 ( UV상의 프래그먼트 )
- 차트 ( UV에 입혀질 이미지 )
- 아틀라스 ( 여러 차트를 커다란 텍스쳐에 모으는 것
기본적인 샘플링 예시
기본적인 Anti aliasing 예시
- 밉맵 생성 ( 산술평균 기반 다운샘플링 )
라이팅
- 퐁 모델 ( sum = diffuse + specular + ambient + emissive ) ( s는 light source의 RGB / m는 물체표면의 RGB )
ox는 독립곱 ( r, g, b ) ox ( R, G, B ) = ( rR, gG, bB )
Z buffering
- pixel에 buffer된 z값과, fragment의 z값을 비교 ( glEnable ( GL_DEPTH_TEST ) )
- 후면버퍼에서 추가계산이 필요없는 픽셀 저장
기타
normal mapping
R = ( normal_x + 1 ) / 2 => normal_x = 2R - 1
G = ( normal_y + 1 ) / 2 => normal_y = 2G - 1
B = ( normal_z + 1 ) / 2 => normal_z = 2B - 1
=> 그래서 폴리곤의 노말벡터를 따라가는 중립은 ( 0.5, 0.5, 1 )
아마 texture가 적용된 polygon의 tangent space에서의 normal값을 world space로 transform하는듯
shadow mapping
- shadow mapping을 위한 ray tracing 단계가 별도로 존재
- ray내 충돌체들(fragment단위)간에 light와의 distance 비교를 통해 shadow 적용여부 체크 ( nearest point sampling )
- light source → 각도별 lay 단에서, 양자화된 각도별 nearset distance를 구함
- 이후 영향범위 내 각 object의 texel에 대한 light의 가려짐 판정 시, light - texel distance VS buffer nearest distance 비교하여 차이가 나면(nearest가 더 작으면) 가려짐 판정
자글그림자의 원인
- 충돌지점좌표는 연속적인 그림자인데 반해, 비교대상 ( 버퍼에 저장되어있는 타겟 ) 은 양자화된 texel단위이기 때문에, 해당 texel의 영역내에있는, 보다 멀리있는 점들은 연속표면임에도 덮임판정을 받음
- 그래서 bias를 무시할 범위를 파라미터로 관리함
Ambient occlusion
- 샘플 지점이 주변으로 부터 얼마나 닫혀있는 지
- Normal vector 기준 지정된 비산각(spread)/유효거리(max distance) 내 probe ray를 통해 object
- 오브젝트에 hit된 probe ray 비율에 비례하여, Bright ↔ dark
- Property
- sample : probe ray 횟수 ( spread와 합해서 밀도 )
- birght/dark :
- spread : 프로브 비산각 범위
- max distance : 유효 프로브 거리
- reflective : surface의 노말이 아니라, 입사각 기준
- fall off : 감쇠효과 (거리기준)
'3D Graphics' 카테고리의 다른 글
Graphics 개요2 (0) | 2024.05.22 |
---|---|
기본 수학 (0) | 2024.05.22 |
FBX 구조 (0) | 2024.05.22 |
DX11 레퍼런스 (0) | 2024.05.22 |