본문 바로가기

전체 글86

Rasterization(8) - 원근 투영 정투영에서 원근투영 바꿔서 구현하면 시각적으로 왜곡이 일어납니다. 이러한 왜곡을 개선하는 원리를 알아봅시다. 일단 원근 투영은 가상 공간의 물체를 화면으로 투영합니다. 삼각형 각각의 버텍스들을 눈 방향으로 연결할 수 있고, 이 중에서 화면에 교차하는 점을 찾는다라고 생각할 수 있습니다. 삼각형을 화면으로 투영시키기 위해서는 3개의 점을 모두 시점을 바라보는 방향으로 화면위로 투영시키면 됩니다. 시점과 버텍스를 옆에서 본다고 가정해봅시다.보면 A라는 점을 화면으로 투영시키고 싶습니다.그렇다면 화면위에 A라는 점이 어떻게 보일지 A` 를 구해야 합니다. 시점(Camera)도 알고 A(Object)도 압니다. 이 때 시점과 A를 연결한 선에서 y축위에 어디에 오는 지 확인해야합니다.p = 눈과 화면사이의 거리.. 2024. 7. 28.
Rasterization(7) - 후면 추려내기 이번에는 후면 추려내기(Back Face Culling)에 대해서 알아보겠습니다. 용어 그대로 삼각형의 뒷면을 그리지 않는다는 것입니다. 기본적으로 후면 추려내기를 사용하는 이유는 수많은 삼각형으로 모델이 이루어져있기 때문에 최적화를 위해 사용합니다. 그래서 가급적이면 눈에 보이는 것만 그릴 수 있도록 만드는 것입니다. 눈에 보이지 않는 삼각형을 지우는 기술은 다양하지만 가장 기본적인 후면 추려내기 기술을 알아보겠습니다.   그림에서 보시면 눈으로 보는 방향이 실선입니다. 점선들은 실선에 가려져서 보이지 않습니다. 그래서 렌더링을 할 때 눈에서 봤을 때 뒷면이다 하는 삼각형들을 아예 그리지 않는 것을 후면 추려내기라고 합니다. 가상 공간에 있는 삼각형을 렌더링 한다고 가정하겠습니다. 가장 먼저 삼각형의 .. 2024. 7. 28.
쉐이더를 사용하는 이유(VS, PS) 그래픽 파이프라인에서 쉐이더라는 것이 굉장히 많이 들어가있습니다. 쉐이더가 뭔지 이해하면 DirectX 사용이 훨씬 편해집니다. DirectX 같은 API가 이런 구조로 이루어져있는 것은 필요한 부분만  구현할 수 있도록 만들어준 것입니다. 그래픽 파이프라인 그림을 보면 쉐이더만 있는 것 처럼 그려져 있습니다. 프로그래머가 구현할 부분은 쉐이더고 나머지는 감춰놓은 것입니다.유저들도 더 화려한 그래픽을 원하기 때문에 프로그래머가 직접 제어하는 것을 원합니다.그래서 점점 더 다양한 쉐이더들이 추가되는 것으로 발전해왔습니다. 가장 기초가 되는 쉐이더들은 vertex, pixel Shader 입니다.이 두가지를 정확히 이해하시면 나머지들은 시간이 지나면서 자연스럽게 익혀질 것입니다. 쉐이더 -> 가상공간에 있는.. 2024. 7. 27.
Rasterization(6) - 깊이 버퍼(Depth Buffer) Depth란 깊이라는 뜻입니다. 화면으로부터 가상공간으로 얼마나 깊이가 들어갔는가라는 의미에서 깊이버퍼라고 부릅니다. 가상공간으로 들어가는 방향이 z방향이기 때문에 z-buffer라고도 불립니다.Depth buffer의 기본원리는 Ray Tracing과 동일합니다. z = 1, z = 2, z = 3 인 3개의 물체가 존재할 때 앞에있는 물체가 그려져야합니다. 뒤에있는 물체는 앞에있는 물체에 가려서 그리지지 않아야 합니다. 정투영에서는 비교적 쉽게 Depth buffer를 구할 수 있습니다. 하지만 원근투영에서는 조금 다르게 구현해야합니다. 깊이 버퍼에서 수정해야하는 것들은 1. Render 시작할 때 Depth buffer 초기화 2. 삼각형 안에 픽셀들의 z값 구하기 3. 깊이 버퍼를 업데이트할 수 .. 2024. 7. 27.
Rasterization(5) - 위성 만들기 DirectX CPU에서 연산하는 것이 아닌 GPU에서 연산합니다.그러므로 CPU의 vertices, indices, colors 같은 기하 정보들을 나중에 GPU 버퍼에 넘겨줘야 한다.(GPU 연산이 더 빠르기 때문) 그래픽 연산은 매우 단순한 행렬 연산이고 단순한 작업에 GPU가 특화 되어있기  때문에 GPU에서 연산처리를 수행하는 것이 옳습니다. 처음 시작할 때 CPU->GPU 복사를 하고 반복적으로 사용합니다. (CPU->GPU 복사 느림) 기본적으로 위성을 구성하는 태양, 지구, 달 위성의 원을 만들어보죠. 태양은 돌지않기 때문에 지구와 달의 각속도와 공전 각도를 정해주고 태양과 지구의 거리, 지구와 달의 거리도 구해줍니다.자전과 달리 공전을 할때에는 이동을 먼저 한 후 회전을 구해줍니다. 태양.. 2024. 7. 20.
Rasterization(4) - 물체의 이동과 회전 2차원 이동 및 회전 매 프레임당 처음부터 시작한다. 이전 프레임에서 이동하고 회전하는 값을 누적시키지 않습니다.매 프레임당 초기화하기 때문에 원점에서 회전이나 이동이 되지 않은 기본값으로 실행합니다. 내부적으로 매 프레임당 아주 빠른 속도로 지금 움직이는 절차들을 진행한뒤 렌더링 결과를 나타내는 것이다. 이동과 회전은 순서가 중요하다. 원점에서 회전을 한 뒤 움직여야 제대로 작동된다. 회전하는 방법 2차원 회전에서는 어떤 점에서 회전하는 지 중요 3차원은 어떤 회전 축에서 회전하는 지 중요 어떤 점 (x, y)가 있습니다. x = r * cos(phi), y = r * sin(phi) 회전 후의 각도가 (x`, y`) 가 있고 x` = r * cos(phi + theta) y` = r * sin(phi.. 2024. 7. 20.