전체글18 [DirectX11] 멀티샘플링 (안티앨리어싱 기법) 슈퍼샘플링 supersampling 컴퓨터 모니터의 픽셀수는 한정적이기 때문에 선을 완벽하게 표현할 수 없다. 따라서 선이 픽셀단위로 깨져서 계단처럼 보이는 계단 현상(stair-step effect) 또는 앨리어싱(aliasing)이 발생한다. 그림판에서 직선을 그으면 자연스럽지 않고 깨져 보이는 예를 떠올릴 수 있다. 모니터의 해상도를 높이지 않고 이러한 문제를 해결할 수 없을까? 이를 해결하는 안티앨리어싱(antialiasing) 기법 중 하나가 슈퍼샘플링(supersampling)이다. 슈퍼샘플링은 후면 버퍼와 깊이 버퍼를 화면 해상도의 4배로 만드는 것이다. 4배 높은 해상도의 후면 버퍼에 렌더링한 후, 화면에 제시할(present) 때에는 4개의 서브픽셀들을 평균한 색상이 한 픽셀의 최종 색상.. 그래픽스(DirectX) 2023. 5. 12. [DirectX11] Direct3D 장치 초기화 Device, Context와 SwapChain 생성 Device/Context 렌더링을 위해 첫 번째로 해야 하는 것은 디바이스와 컨텍스트를 초기화하는 것이다. 디바이스(ID3D11Device)는 하드웨어와 상호작용하여 GPU에 리소스를 할당하거나 백 버퍼를 지우게 하는 등의 일을 시킬 수 있게 하는 인터페이스이다. 디바이스 컨텍스트(ID3D11DeviceContext)는 디바이스가 가진 리소스를 이용해 파이프라인 상태를 설정하고 렌더링 명령을 생성하는 데 사용되는 인터페이스이다. ComPtr _device; ComPtr _deviceContext; 인터페이스 이름에서 'I'는 COM 인터페이스를 의미한다. COM이란, Component Object Model로, DirectX가 프로그래밍 언어에 독립.. 그래픽스(DirectX) 2023. 5. 10. [DirectX11] Ray와 물체의 충돌 판정 (Intersection) Ray와 물체의 Intersection Ray- Mesh ray를 이용해서 picking을 하기 위해서는 일단 ray가 mesh를 지나는지를 알아야 할 것이다. mesh를 이루는 각 삼각형들에 대해서 충돌 판정을 하고, 삼각형과 충돌이 확인되면 그 삼각형이 속한 mesh가 선택될 수 있다. 그러나 매 프레임마다 mesh를 이루는 수많은 삼각형에 대해서 충돌 체크를 한다면 부담이 될 것이다. 연산량을 줄이기 위해 bounding box와 같은 단순한 collider와 먼저 충돌 체크를 하고, 충돌했을 때 삼각형들을 체크한다. bounding box와 충돌하지 않았으면 삼각형과도 충돌하지 않은 것이므로 연산을 할 필요가 없다. picking, 충돌 감지 목적의 단순한 mesh가 따로 저장되어있는 경우도 있다.. 그래픽스(DirectX) 2023. 5. 1. [DirectX11] 2D화면 클릭해서 3D물체 선택하기(picking ray) picking ray 마우스로 화면을 클릭하여 3D 물체를 선택하게 하려면 어떻게 해야 할까? 2D의 스크린 좌표에 그 지점을 투영한 3D 좌표를 구해야 한다. view space는 3D 공간이지만, 2D 좌표로부터 3D로 변환하기 때문에 하나의 좌표값으로 대응되지 않는다. 따라서 눈, 즉 의 원점에서 클릭한 점을 지나는 방향 벡터로 광선(ray)을 쏜다. 그리고 광선이 여러 물체를 지날 수 있지만, 카메라에 가장 가까운 것을 선택하도록 한다. screen space에서 클릭한 점을 가지고 view space에서 picking ray를 구현해야 하므로 좌표 변환이 필요하다. 화면을 그리기 위한 좌표 변환에서 반대로 진행하면 된다. Screen spcae → View space screen space에서 .. 그래픽스(DirectX) 2023. 4. 29. [DirectX11] 삼각형 그리기 (렌더링 파이프라인) 기본 2D 삼각형을 그리는 과정을 정리한다. Vertex data 정의 먼저 정점을 정의한다. 우선 위치와 색상 정보만 가지고 있게 만들자. struct Vertex { Vec3 position; Color color; }; geometry 만들기 이 정점들로 이루어진 도형(geometry)를 정의한다. 정점들의 vector로 만들자 vector _vertices; _vertices.resize(3); _vertices[0].position = Vec3(-0.5f, -0.5f, 0.f); _vertices[0].color = Color(1.f, 0.f, 0.f, 1.f); _vertices[1].position = Vec3(0.f, 0.5f, 0.f); _vertices[1].color = Color(0.. 그래픽스(DirectX) 2023. 4. 29. [DirectX11] GPU에게 일 시키기(Compute Shader) GPU GPU는 단일 위치 또는 순차적 위치에 있는 많은 양의 메모리를 처리하는데 최적화되어있다. 병렬적으로 처리될 수 있는, 비슷한 작업을 해야 하는 많은 양의 데이터 요소가 있을 때 GPU를 사용한다. 예를 들어 그래픽스에서 vertex와 pixel은 독립적으로 처리되기 때문에 병렬적으로 연산한다. 다른 예로, particel system의 경우 입자들이 서로 상호작용하지 않는다고 단순화하면 각 입자의 물리는 독립적으로 계산될 수 있다. 이러한 GPU의 병렬 구조의 방대한 계산력은 그래픽 외의 몇몇 작업에서도 이점이 있다. 그래픽이 아닌 다른 곳에 GPU를 사용하는 것을 general purpose GPU (GPGPU) programming라고 한다. 이러한 GPU의 활용은 GPGPU뿐만 아니라 그래.. 그래픽스(DirectX) 2023. 4. 29. 이전 1 2 다음