목록전체 보기 (124)
서의 공간
다음은 도형을 그리기 위한 클래스이다. 기하구조를 결정하는 클래스까지. 그리고 상기할 것은 투영 공간 변환 매트릭스를 구하고 이것이 각 정점에 곱하여 연산하는 것은 VertexShader의 역할이다. 우리는 단지 이 매트릭스를 셰이더에 제출한다. 물론 셰이더 파일에 각 정점과 이 매트릭스를 곱하라는 연산을 구현하긴 하지만 말이다. Drawable 클래스 더보기 핵심 개념 Drawable는 모든 그리기 가능한 오브젝트의 베이스 클래스이다. 추상 클래스로서 DrawableBase가 이 클래스를 상속받고, 실제 오브젝트들은(Box와 같은) DrawableBase 클래스를 상속받는다. 함수의 역할을 하나씩 살펴본다. GetTransformXM(): 이 함수는 오브젝트의 월드 공간 기준 매트릭스를 반환하는 함수이..
실제 팩토리얼 값을 구할 필요없다. 팩토리얼의 정의를 보면 \[n! = n\times(n-1)\times(n-2)\times\cdots\times 2\times1\] (예) \[10! = 10\times 9\times 8\times 7\times 6\times 5\times 4\times 3\times 2\times 1\] 문제는 일의 자릿수부터 시작해서 처음으로 0이 안나오는 자릿수까지의 0의 개수를 구하는 것이고, 위 식에서 두 수를 곱해서 10이 나오려면 \(10\times 1\)또는 \(5\times 2\)이다. 그러면 결국 나머지 숫자들의 곱에(마지막 자리가 결코 0이 되지 않는다) 100을 곱한 꼴이 되어 0의 개수는 2개다. 이런 식으로 생각하다 보면 0이 추가되는 규칙이 발견되는데, 125..
이 장의 목표는 앞서 도형을 그리는 방법에서 설계를 새롭게 하여 파이프라인에 바인드 가능한 것을 모두 클래스화 한다. 그리고 다양한 구조의 도형을 그려본다. Bindable 클래스는 Bind 가능한 모든 클래스의 베이스 클래스로서, 구조는 다음과 같다. 공통 개념 1. ComPtr::GetAddressOf와 ComPtr::operator&의 차이 ComPtr::GetAddressOf Retrieves the address of the ptr_ data member, which contains a pointer to the interface represented by this ComPtr. Return Value The address of a variable. ComPtr::operator& Release..
핵심 개념 정점의 색상이 아닌 면의 색상 설정 z-buffering 기법을 통한 물체 그리기(컬링) - Depth stencil을 사용해야하는 이유 Graphics.cpp 더보기 Graphics::Graphics( HWND hWnd ) { // ... // create depth stensil state D3D11_DEPTH_STENCIL_DESC dsDesc = {}; dsDesc.DepthEnable = TRUE; dsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; dsDesc.DepthFunc = D3D11_COMPARISON_LESS; wrl::ComPtr pDSState; GFX_THROW_INFO( pDevice->CreateDepthStencilSta..
핵심 개념 Constant buffer: 상수버퍼에는 [파이프라인(셰이더)로부터 적은 레이턴시로 액세스], [CPU로 인한 빈번한 갱신]같은 성능이 요구된다. 이로 인해 상수버퍼의 메모리 구조에는 [4바이트 얼리어너먼트]로 [각 요소는 16바이트를 경계를 사이에 걸친 형태로는 할 수 없으며 전체 사이즈는 16의 배수(최대 4096 x 16 바이트)] 라는 조건이 붙어있다. 즉 버퍼사이즈는 16의 배수이어야 한다. 상수버퍼에 값을 쓰는 것은 버퍼의 Usage가 D3D11_USAGE_DEFAULT일 때의 서브리소스에 쓰는 방식과 D3D11_USAGE_DYNAMIC일 때에 ID3D11Device::Map~ UnMap을 사용하는 방식이 있다. Graphics.cpp 더보기 void Graphics::DrawTe..
Graphics.cpp 더보기 void Graphics::DrawTestTriangle() { HRESULT hr; struct Vertex { struct { float x; float y; } pos; struct { unsigned char r; unsigned char g; unsigned char b; unsigned char a; } color; }; // create vertex buffer (1 2d triangle at center of screen) Vertex vertices[] = { { 0.0f,0.5f,255,0,0,0 }, { 0.5f,-0.5f,0,255,0,0 }, { -0.5f,-0.5f,0,0,255,0 }, { -0.3f,0.3f,0,255,0,0 }, { 0.3f,0..
핵심 개념 도형이 그려지기 위한 과정은 다음과 같다. 1. 정점 타입 정의, 정점의 개수 결정 정점들을 저장하는 정점 버퍼 생성 정점 버퍼를 파이프라인의 IA단계에 바인드 2. 셰이더의 바이트 코드를 관리하는 ID3DBlob 인터페이스로 셰이더 파일 읽기 정점 및 픽셀 셰이더 생성 정점 및 픽셀 셰이더 파이프라인의 각 셰이더 단계에 바인드(VS, PS) 3. 정점의 각 속성에 대한 정보를 작성한다. Semantic name에 주목 InputLayout 생성, 필요 파라미터로 blob을 필요로 함(셰이더 바이트 코드). InputLayout을 파이프라인의 IA단계에 바인드 4. 백버퍼를 파이프라인의 OM단계에 바인드 5. 정점의 기본 기하 구조를 설정하여 파이프라인의 IA단계에 바인드 6. 뷰포트 생성 뷰..
Exception 부분은 넘어간다. 또한 디버깅을 위해 여러 유틸 클래스가 추가되었지만 생략한다. 여기서 핵심은 Graphics.h의 DrawTestTriangle()함수이다. 삼각형이 어떻게 그려지는지 .cpp 코드 내에서 설명한다. 핵심 개념 1. Microsoft::WRL::ComPtr: 템플릿 매개 변수로 지정된 인터페이스를 나타내는 스마트 포인터 형식을 만든다. ComPtr은 기본 인터페이스 포인터에 대한 참조 횟수를 자동으로 유지하고 참조 횟수가 0이 되면 인터페이스를 해제한다. 즉 자동으로 해제해주기 때문에 인터페이스의 Release() 함수를 사용할 필요가 없다. 2. ID3DBlob: ID3DBlob 인터페이스는 D3DCommon.h 헤더 파일에 ID3D10Blob으로 정의된 인터페이스로..
[위키피디아]: 정적 라이브러리 - 위키백과, 우리 모두의 백과사전 (wikipedia.org) [MSDN]: 연습: 정적 라이브러리 만들기 및 사용 (C++) | Microsoft Docs [참고1]: 명월 일지 :: [C++] 라이브러리를 작성해서 사용하기 (Window 환경의 lib, dll) (tistory.com) [참고2]: 라이브러리, 프레임워크, API, ABI 뜻 비교 정리 :: 아인스트라세의 SW 블로그 (tistory.com) [참고3]: https://luyin.tistory.com/201 정적 라이브러리(Static Library)는 컴파일 타임에 호출자가 resolve 하는 루틴, 외부 함수, 변수의 집합으로 목적 파일과 단독 실행 파일 생성 중에 컴파일러와 링커에 의해 대상 애..