목록Graphics API/DirectX 11 - Chili (21)
서의 공간
핵심개념 1. normal map 2. tangent space
핵심 개념 Mesh 더보기 Mesh.h #pragma once #include "DrawableBase.h" #include "BindableCommon.h" #include "Vertex.h" #include #include #include #include #include "ConditionalNoexcept.h" class ModelException : public ChiliException { public: ModelException(int line, const char* file, std::string note) noexcept; const char* what() const noexcept override; const char* GetType() const noexcept override; con..
핵심 개념 1. c++ template meta programming 2. c++ reflection 3. std::move, std::forward 4. universal references 5. perfect forwarding 6. template recursion 7. T&&... args -> parameter pack 이라고 한다. 이것은 파라미터가 한개여도 되고 여러개여도 된다는 것이다. 8. 왜 이렇게 설계를 해야만 하는가? 현재 프로젝트에서 SkinnedBox를 만드는 과정을 살펴보면, Vertex 구조체를 정의한다. Vertex 구조체는 pos, normal, texturecoord 을 포함한다. geometry 클래스 중 하나인 cube 클래스에서 Make() 함수로 정점들의 구조를 ..
핵심 개념 1. assimp 라이브러리 2. import 3D 모델링 3. .obj 파일들을 github에 push하기 위해 .gitignore 파일을 수정 AssTest 더보기 AssTest.h #pragma once #include "TestObject.h" #include "ConstantBuffers.h" class AssTest : public TestObject { public: AssTest(Graphics& gfx, std::mt19937& rng, std::uniform_real_distribution& adist, std::uniform_real_distribution& ddist, std::uniform_real_distribution& odist, std::uniform_real_d..
ConstantBuffer.cpp 더보기 template class ConstantBuffer : public Bindable { public: void Update(Graphics& gfx, const C& consts) { INFOMAN(gfx); D3D11_MAPPED_SUBRESOURCE msr; GFX_THROW_INFO(GetContext(gfx)->Map( pConstantBuffer.Get(), 0u, D3D11_MAP_WRITE_DISCARD, 0u, &msr )); memcpy(msr.pData, &consts, sizeof(consts)); GetContext(gfx)->Unmap(pConstantBuffer.Get(), 0u); } ConstantBuffer(Graphics& gfx..
[영상 24.1.1] Dynamic Lighting 공통 개념 1. MakeIndependent() 함수는 각 정점을 면에 독립적으로 정의한다. 같은 위치에 있는 정점이라도, 면에 따라 중복해서 정점을 정의하여, 정점의 노멀이 면에 맞추어 결정되도록 한다. 그러니까, 0번 점과 4번 점이 동일 위치에 있지만 각 점들이 이루고 있는 면이 다른 면이라면 노멀도 달라야 한다는 의미다. 노멀을 달리하려면 이렇게 같은 위치에 대해 여러 정점을 정의해야 한다. 2. 빛을 표현하기 위해서, 광원(빛의 여러 속성의 색상)과 오브젝트(예: Box) 사이의 거리를 통해 오브젝트의 반사된 빛의 색상을 계산한다. 색상을 계산할 때, 빛에 비치는 면과 안 비치는 면을 구분하기 위해 노멀 벡터를 사용한다. 구체적으로 다음은 광원..
1. 빛의 삼원색 2. 람베르트 코사인 법칙 수직에 가까운 각도로 표면에 입사하는 빛은 스치듯이 입사하는 빛보다 표면을 더 세게 때린다. 이로부터, 노멀 벡터와 빛 벡터 사이의 각도에 기초해서 빛의 세기를 돌려주는 하나의 함수를 생각해 볼 수 있다. 그 함수의 값은 노멀 벡터와 빛 벡터가 정확히 같은 방향일 때 최댓값이어야 하며, 노멀 벡터와 빛 벡터의 각도가 커짐에 따라 점차 감소해야 한다. 그리고 \(\theta>90^\circ\)이면 빛이 표면의 뒤쪽을 때린 것이므로 함수의 값, 즉 빛의 세기는 0이어야 한다. 람베르트 코사인 법칙(Lambert's cosine law)에서 그러한 함수를 유도할 수 있다. \[f(\theta)=\text{max}(cos\theta,0) = \text{max}(L\c..
[영상 21.3.1] 여러가지 오브젝트 그리기 공통 개념 1. 각 오브젝트의 클래스보다 더 중요한 것은, 그 오브젝트의 기하구조를 만드는 클래스이다. Geometry로 시작하는 클래스가 바로 이러한 클래스인데. 오브젝트 클래스는 결국 정점에 대해여 Bindable한 모든 것을 파이프라인에 바인드 하는 것이 하는 일이 거의 전부이다. 반면 Geometry~ 클래스는 실제 오브젝트의 구조를 결정짓고 정점의 인덱스 리스트까지 만들기 때문에 이 부분에 중점을 두고 살펴봐야 할 것이다. Box는 앞서 이미 보았으므로 생략했다. 2. Rasterizer Stage: 정점 파이프라인을 지나 출력된 프리미티브 데이터는 래스터라이저 스테이지에 보내져 래스터라이저에 의 해 렌더링 할 픽셀(텍셀)단위로 분해된다. 이때 래스..
다음은 도형을 그리기 위한 클래스이다. 기하구조를 결정하는 클래스까지. 그리고 상기할 것은 투영 공간 변환 매트릭스를 구하고 이것이 각 정점에 곱하여 연산하는 것은 VertexShader의 역할이다. 우리는 단지 이 매트릭스를 셰이더에 제출한다. 물론 셰이더 파일에 각 정점과 이 매트릭스를 곱하라는 연산을 구현하긴 하지만 말이다. Drawable 클래스 더보기 핵심 개념 Drawable는 모든 그리기 가능한 오브젝트의 베이스 클래스이다. 추상 클래스로서 DrawableBase가 이 클래스를 상속받고, 실제 오브젝트들은(Box와 같은) DrawableBase 클래스를 상속받는다. 함수의 역할을 하나씩 살펴본다. GetTransformXM(): 이 함수는 오브젝트의 월드 공간 기준 매트릭스를 반환하는 함수이..
이 장의 목표는 앞서 도형을 그리는 방법에서 설계를 새롭게 하여 파이프라인에 바인드 가능한 것을 모두 클래스화 한다. 그리고 다양한 구조의 도형을 그려본다. 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..