본문 바로가기

전체 글

(223)
DrawPrimitive , DrawPrimitiveUP DrawPrimitive 는 Vertex를 그릴 때 사용하는 함수로 할당이 GPU에 되었을 때 쓴다. DrawPrimitiveUP 의 UP은 User Point 로 사용자가 직접 시스템 메모리에 할당한다. 시스템 메모리에 할당된 것을 다시 GPU에 쓰기 때문에 Up함수는 더 느리다. 대신 사용자가 컨트롤할 수 있다는 장점이 있다. DrawIndexPrimitive , DrawIndexPrimitiveUP 함수를 사용하는 Index 도 마찬가지이다.
[3D] 지형(Terrain) 3D 공간에 지지대 역할을 하는 것이 지형이다. 지형은 버텍스 버퍼와 인덱스 버퍼로 만들 수 있다. 버텍스 버퍼로 생성하게 되면 각 폴리곤 마다 정점이 3개씩 존재하기 때문에 큰 지형의 경우 부하가 발생한다.하지만 인덱스 버퍼로 지형을 생성하게 되면 각 포인트 마다만 정점을 생성하고, 인덱스 버퍼로 순서만 지정하면 되기 때문에훨씬 가볍다. 만약 w, h 크기의 지형을 생성한다고 하자. 이때 버텍스 버퍼든, 인덱스 버퍼든 셀의 개수는 (w-1)*(h-1)개 이다. 버텍스 버퍼로 지형을 생성할 때 필요한 정점의 개수는한 폴리곤당 필요한 정점의 수가 3개 이고, 한 샐당 존재하는 폴리곤의 수가 2개 이므로(w-1)*(h-1)*6 개 이다. 만약, 인덱스 버퍼로 지형을 생성할 때 필요한 정점의 수는 w * h ..
[3D] 높이 맵 아래의 동영상은 높이 값을 추출해 큐브를 높이마다 다른 위치에 둔 것이다. 그렇다면 중간 높이를 계산하는 방법을 알아보자. 지형에서 각 정점마다 높이가 다르다. 그때 저 빨간 점 vPos의 높이를 알고 싶다면 보간을 통해 계산해야 한다. 먼저 빨간 점 vPos가 있는 셀의 인덱스를 알아야 한다. 지형을 처음에 설정할 때, 원점을 중심으로 (w/2,-h/2) 떨어진 곳에서 부터 시작했기 때문에 인덱스를 찾을 때도 이것을 감안해야 한다. 인덱스를 알았다면 그 인덱스의 번호는 초록 점이 될 것이고 그것으로 파란 점, 노란 점의 높이 값을 알아낸다. 초록 점을 기준으로 빨간 점 vPos는 (0.1,0,-0.6) 만큼 떨어져 있다.[y 값은 임의로 0이라고 했다.]만약 x의 절대값이 z의 절대값보다 크다면 우 상..
[3D] 픽킹 (Picking) 픽킹이란 2D 스크린 좌표를 3D 좌표로 변경한 후 동일한 공간 내에서 교차 판정 하는 것이다. 여기서 중요한 것은 2D 좌표를 3D 좌표로 변경한다는 것이고, 동일한 공간! 내에서 교차판정한다는 것이다.동일한 공간이 중요하다.지형의 좌표가 존재하는 공간이 월드 공간이기 때문에 반드시 월드 공간으로 바꿔줘야한다. 과정을 간단히 말하자면,1. 윈도우 좌표를 3D 좌표로 변경시킨다.2. 폴리곤과 충돌체크를 한다. (IntersectTriangle)이다. 픽킹이 처음에 어렵게 느껴지는 이유는 이 IntersectTriangle 함수가 프로그램을 위해 최적화된 함수로 몇몇 과정들이 축소되어있기 때문이다. ( Picking에 관한 코드는 Dx SampleBrowser에도 존재 하니 그걸 참고하세용 ~ 저도 그걸 ..
[3D] 알파 블렌딩 (ALPHABLEND) 알파 블렌딩 이란 픽셀을 조합하는 기술이다.Dest(대상)에 Src(원본) 을 변경 조합해서 픽셀 색을 조정한다. 알파 블렌딩을 할 때 주의 사항은 현재 그려져 있는 대상과 렌더링할 폴리곤의 색을 합성하는 것이기 때문에 불투명 오브젝트를 렌더링 해야한다. 알파 블렌딩을 할 때는 1. 블렌딩을 하지 않는 물체를 먼저 그리고, 2. 블렌딩을 할 물체를 카메라와의 거리에 따라 정렬한다.3. 블렌딩을 이용하는 물체들을 뒤에서 앞 순서로 그려나간다. 알파 블렌딩은 부하가 심한 작업이므로 렌더링이 끝나면 꺼줘야 한다. 또한 블렌딩이 필요한 폴리곤들을 한번에 처리해 하나의 프레임에서 여러 번 블렌딩을 켜고 끄는 일은 피하는 것이 좋다. 키고 끄는 방법은 g_pd3dDevice->SetRenderState(D3DRS_..
[3D] 컬링 모드 3D 의 컬링 모드에 3가지 인줄 알았는데 알고보니 4가지가 있다. typedef enum _D3DCULL { D3DCULL_NONE = 1, D3DCULL_CW = 2, D3DCULL_CCW = 3, D3DCULL_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */} D3DCULL; D3DCULL_NONE 뒷면의 컬링(Culling)는 하지 않는다.D3DCULL_CW뒷면을 우회전으로 컬링(Culling) 한다. (시계)D3DCULL_CCW뒷면을 왼쪽 회전으로 컬링(Culling) 한다. (반시계)D3DCULL_FORCE_DWORD이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다. 이 값은 사용되지 않았다. g_pd3dDevice->SetRenderSt..
[3D] SetSamplerState 텍스쳐는 스크린 좌표에서 삼각형에 입혀진다. 텍스쳐와 폴리곤의 크기가 다른경우 축소 혹은 확대 되어 적용된다. 이때 왜곡이 발생하는데 필터링을 통해 이러한 왜곡현상을 줄이기 위해 SetSamplerState 함수를 사용한다. HRESULT SetSamplerState( DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value );Sampler[in] 샘플러 스테이지 인덱스.Type[in] 이 파라미터에는,D3DSAMPLERSTATETYPE 열거형의 임의의 멤버를 지정할 수 있다.Value[in] 설정하는 스테이트값. 이 값의 의미는 Type 파라미터에 의해 정해진다. 성공했을 경우는,D3D_OK 를 돌려준다.실패했을 경우는,D3DERR_INVALIDCALL 를 돌려준..
[C/C++] 템플릿 템플릿 오버로딩을 활용하기 위한 것으로 기능은 결정되어 있으나 자료형이 정해지지 않은 것이다. 템플릿이란 말 그대로 무엇을 만들기위해 찍어내는 틀이다. 템플릿은 크게 함수 템플릿과 클래스 템플릿으로 나눌 수 있다.함수 템플릿은 간단히 말하면 함수를 찍어내는 틀을 말하고, 클래스 템플릿은 클래스를 찍어내는 틀을 말한다.