2023. 2. 15. 16:31ㆍ컴퓨터 그래픽스/그래픽 알고리즘 및 표현
Rasterization은 3D 좌표계의 오브젝트를 2D로 비율에 맞게 옮겨주는 과정이다.
Rasterization을 이용하여 삼각형을 그려볼 것이다.
Rasterization의 과정은 2단계로 볼 수 있다.
- 3d 좌표계에서 NDC(normalized device coordinates) 로 옮겨주는 과정
- NDC에서 Raster 좌표계(Screen 좌표계)로 옮겨주는 과정
그리고 삼각형을 그리기 위해서 해당 픽셀이 삼각형 내부에 있는지 판단하고 내부에 있다면 색을 넣어주어서 삼각형을 그리게 된다.
1. 3d 좌표계에서 NDC로 옮겨주는과정
보통 3D에 물체가 있다고 가정하고 해당 vertex들을 처리하는게 그래픽스 파이프라인이다. 그래서
3차원 벡터의 vertex들을 정해주고 해당 vertex를 NDC 좌표계로 전환하게 된다.
왜 NDC 좌표계를 이용할까?
NDC 좌표계를 이용하는 이유는 display screen 마다 화면 해상도 및 비율이 다른데 각각 다르더라도 독립적으로 편하게 처리하기 위해서 NDC 좌표계를 이용한다. NDC 좌표계는 1:1 화면 비율에 2D이고 중심은 (0,0) X 좌표는 [-1,1], Y좌표는 [-1,1] 범위를 갖게 된다.
NDC좌표계로 전환하는 방법
1. 3차원 점을 가져온다.
2. aspect ratio ( 화면 가로세로비율) 을 이용하여 X와 Y 좌표를 1:1로 맞춰준다.
3차원좌표.x / aspectRatio, 3차원좌표.y 를 이용한다.
return (3d.x / aspectRatio, 3d.y)
raster 좌표계로 전환하는 방법
raster 좌표계의 x, y의 범위는 픽셀들이므로 [0, width-1] x [0, height-1]가 되는데 화면이 아닌 가상 세계에서 그려진 것들은 연속적이고 geometric object이지만 raster 좌표계는 픽셀들이므로 제대로 표현이 되지 않을 수 있다. 그러므로 x 시작을 - 0.5 끝을 +0.5씩 해주고, y 시작을 -0.5 끝을 +0.5를 해주어서 화면 중앙에 픽셀들이 오도록 한다.
그리고 Scale을 맞춰주기 위해서 width/ 2 , height/2 를 이용한다.
NDC 좌표계는 -1 ~ 1 범위인데 screen 좌표계는 0 ~ width 범위이므로 +1을 해주어야한다. 그리고 y축은 상하 반전을 통해 + 가 나오면 내려가는게 아니라 올라가도록 표현해준다.
Screen.x = (NDC.x +1) * width / 2
Raster.x = Screen.x - 0.5
Screen.y = (NDC.y + 1) * height / 2
Raster.y = Screen.y - 0.5
return (Screen.x, -Screen.y)
삼각형이 내부에 있는지 외부에 있는지 대한 판단
a0 은 v0과 v1, v0과 임의 점 point 간의 normal vector 이다 normal vector의 의미는 수직벡터라는 것도 있지만 length(normal vector) / 2 해준다면 삼각형의 넓이가 된다.
그래서 a0 ≥ 0.0 && a1 ≥ 0.0 && a2 ≥ 0.0 이라면 삼각형 내부 점이라고 판단할 수 있다.
왜냐하면 openGL 에서는 좌표계를 오른손 좌표계를 따르고 DirectX는 왼손 좌표계를 따르는데,
왼손 좌표계를 기준으로 생각해보면 v1 - v0 벡터 p - v0 벡터끼리의 cross product 했을 때 양수가 나와야 삼각형 안이고 만약 바깥 점이라면 같은 계산을 했을 때 순서가 반대가 되어 음수가 나오게 되는 것이다.
결과
'컴퓨터 그래픽스 > 그래픽 알고리즘 및 표현' 카테고리의 다른 글
2차원 transformation (0) | 2023.02.22 |
---|---|
Rasterization 원 그리기 (0) | 2023.02.22 |
perspective 원근표현 (0) | 2023.02.09 |
Phong shading 을 이용한 물체의 표현 (0) | 2023.02.05 |
Drawing Sphere 구 그리기 (0) | 2023.02.05 |