목록Graphics API (38)
서의 공간
핵심 개념 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..
핵심 개념 정점의 색상이 아닌 면의 색상 설정 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..