본문 바로가기

분류 전체보기

(308)
[그래픽스] 래스터화(Rasterization)가 빠른 이유 광추적, 레이트레이싱을 사용할 때 사용자가 보는 시점으로부터 모든 픽셀방향으로 광선을 쏴줘야 한다. 그래서 픽셀 개수 만큼의 광선은 쏴줘야 하고 그만큼 계산이 오래걸린다. 래스터화에서는 물체에 빛을 쏘는 것이 아니라 물체를 렌더링하고자 하는 화면 위로 투영시킨다. 삼각형의 경우 정점이 3개이기 때문에 정점의 위치 3개만 알면 삼각형을 투영시킬 수 있다. 그리고 투영시킨 삼각형을 포함하는 가장 작은 사각형, 바운딩 박스를 구한다. 이렇게 하면 레이 트레이싱과 다르게 바운딩 박스 밖의 픽셀에 대해서는 계산할 필요 없으므로 래스터화가 빠른 것이다.
23. 05. 19 - 프로토타입, map 사용시 주의점 프로토타입 어떤 클래스의 원형 객체(프로토타입)를 만들어 놓고 그 클래스의 객체가 필요할 때마다 원형 객체를 복제해서 만드는 패턴이다. 이 방식은 속도가 빠르다는 장점이 있는데 서버를 사용하지 않는다면 체감이 되지 않을 수 있다. 서버를 연동하는 방식의 게임에서 처음에 프로토타입을 만들 때 서버에서 데이터를 받아와서 만든다. 그 후부터 그 클래스의 객체를 만들 경우 서버와 연동 필요없이 프로토타입을 복제해서 만들면 되기 때문에 속도가 빠르다. Release 모드에서 문자열 상수의 주소는 바뀔 수 있다. map을 사용할 때 key값으로 const char*이나 string을 사용하곤 한다. const char*을 사용할 경우 문자열 상수를 사용한다는 것인데 이 경우 주의해야 할 점이 Release 모드에서..
[그래픽스] 투명한 물체에서 빛의 굴절 빛은 불투명한 물체를 만나면 반사되지만 투명한 물체를 만나면 굴절되면서 물체 안쪽으로 들어간다. 굴절되는 각도는 물체가 어떤 물질로 이루어져있느냐에 따라 다르다. 굴절되는 각도는 물체의 물질에 따라 정해져있다. d를 빛이 표면과 부딪히는 벡터, t를 빛이 부딪히고 굴절되어 들어가는 벡터라고 했을 때 sinθ1/sinθ2의 값을 eta라고 하고 이값이 유리일 경우 1.5라고 하자. 이 때 벡터 t를 어떻게 구할까? cosθ1을 내적을 통해 구할 수 있고 그렇다면 sinθ1값도 구할 수 있다. 그러면 eta(1.5)와 sinθ1값을 아니까 sinθ2값도 구할 수 있다. 벡터 t는 -n방향으로 cosθ2만큼 간 벡터와 m방향으로 sinθ2만큼 간 벡터를 더하면 구할 수 있다.(m은 d의 시작점에서 n으로 향하..
[그래픽스] 슈퍼 샘플링 슈퍼 샘플링은 샘플링을 할 때 더 작은 단위로 쪼개어 평균값을 구해 색을 결정함으로써 계단 현상을 없애고 이미지를 더 부드럽게 보일 수 있게 하는 기법이다. 포인트 샘플링할 때 픽셀 중간 검은색 점의 색깔로 설정했다면 슈퍼 샘플링은 중앙 점을 기준으로 4개로 쪼개서 쪼갠 사각형의 중점의 색을 평균을 내어 색을 결정한다. 재귀적으로 이 계산을 반복하는데 반복할수록 색이 자연스러워지지만 그만큼 계산이 오래 걸리기 때문에 느려진다.
23. 05. 17 - 스레드 관련 함수 스레드는 프로그래밍에서 두개 이상의 흐름이 필요할 때 사용한다. 이번에는 로딩하면서 화면에 출력을 동시에 하기 위해 스레드를 사용했다. 스레드들이 서로 공유하는 자원을 크리티컬 섹션이라고 한다. 서로 공유하기 때문에 동시에 두 개 이상의 스레드가 접근하면 문제가 발생할 수 있다. 그래서 이를 통제하기 위한 함수들이 존재한다. InitializeCriticalSection으로 먼저 크리티컬 섹션을 초기화한다. 그리고 _beginthreadex함수로 스레드 함수로 루틴을 실행하는 스레드를 만들 수 있다. uintptr_t _beginthreadex( // NATIVE CODE void *security, unsigned stack_size, unsigned ( __stdcall *start_address )..
[그래픽스] Texturing, Sampling 어떤 물체의 표면을 효율적으로 표현하는 법은 이미지를 물체의 표면에 입히는 것이다. 그것을 Texturing이라고 한다. Texturing을 하기 위해서 Texture 좌표가 이미지에서 어느 위치인지 알아야 한다. 이미지 좌표계는 DirectX에서 왼쪽 위가 원점이고 오른쪽,아래쪽으로 갈수록 크기가 커지는 UV좌표계이다. 왼쪽 그림에서 점 p 가 가리키는 곳을 이미지의 uv좌표에서 가져와야 하는데 이것을 샘플링이라고 한다. https://cppking.tistory.com/240 무게 중심 좌표계 링크 이미지에서 p의 좌표를 구하는 법은 무게 중심 좌표계를 통해 Texture에서 p의 좌표를 구해야 한다. 그 후는 샘플링의 종류에 따라 나뉜다. 샘플링 종류는 포인트 샘플링과 리니어 샘플링으로 나뉜다. 포..
[그래픽스] 무게중심 좌표계 삼각형의 세 정점이 각각 빨강, 파랑, 초록의 색상 값을 갖고 있다고 하자. 각 정점에 가까워질수록 해당 색상의 값을 높게 가지기 위해선 어떻게 해야할까? 이럴 때 사용하는 것이 무게 중심 좌표계이다. 무게 중심 좌표계를 이용하면 세 정점과 현재 삼각형 위의 점까지 거리를 계산해서 현재 점의 색깔을 구할 수 있다. Interpolation(내삽)과 관련이 있는 개념이다. 삼각형의 무게중심 좌표는 어떻게 구할까? 세 정점의 평균 좌표가 무게 중심이다. 즉, 1/3*c0 + 1/3*c1 + 1/3*c2 이 무게중심의 좌표이다. 여기서 c2 정점으로 가까워진다면 c2의 계수는 커지고 c0과 c1의 계수는 줄어들 것이고, c0 정점으로 가까워진다면 c0의 계수는 커지고 c1과 c2의 계수는 줄어들 것이다. 중요..
23. 05. 16 - Depth Buffer Depth Buffer 우리가 더블 버퍼링을 위해 저장하는 백버퍼는 텍스쳐다. 그리고 동시해 3d에서는 백버퍼와 같은 크기의 Depth Stencil Buffer을 저장한다. 3d에서 어떠한 물체는 그 물체보다 카메라에 가까이 있는 물체에 의해 가려지기 때문에 이러한 정보를 depth buffer가 담는다. 물체가 가려지는 것을 표현하기 위해 픽셀마다 깊이 테스트를 통과해야 그 픽셀에 색깔이 그려진다. 처음에 픽셀들은 카메라의 최대 깊이로 초기화된다. 물체가 카메라가 표현할 수 있는 최소 범위와 최대 범위의 사이에 있다면 그 픽셀의 깊이 버퍼 값을 물체의 깊이 값으로 정한다. 한 픽셀에 물체가 두개 이상 있다면 깊이값 중 가장 작은 값이 그 픽셀의 깊이 버퍼에 저장된다. 가장 작다면 맨 앞에 있는 것이기..