목록전체 보기 (124)
서의 공간
핵심 개념 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..
[문제]: 1697번: 숨바꼭질 (acmicpc.net) #include #include #include using namespace std; int dist[100001]; int N, K; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N >> K; fill(dist, dist + 100001, -1); // 시작지점 dist[N] = 0; queue q; q.push(N); // 동생의 위치를 찾으면 while문 종료 while (dist[K] == -1) { int cur = q.front(); q.pop(); for (int nxt : { cur - 1, cur + 1, 2 * c..
[문제]: 4179번: 불! (acmicpc.net) 불의 이동은 지훈이의 이동에 독립적이다. 지훈이가 어떻게 움직이든 불은 확산되는 규칙에 따라 계속 확산시켜나가면 된다. 반면 지훈이는 그렇지 않다. 지훈이는 불의 이동에 따라 움직임에 제한을 받게 된다. 이렇게 두 시작점이 서로 간에 영향을 주지 않는 경우라면(현재 불만 지훈이의 이동에 영향을 준다), 두 번의 BFS만으로 해결할 수 있다. 불만 먼저 BFS을 하여 각 공간의 시간들을 구한 후, 지훈이를 BFS 한다. 지훈이가 각 장소에 도착하는 시간과 불이 도착하는 시간을 비교하여 움직임을 제한한다. 추가적인 내용은 코드에 주석으로 달아놓았다. #include #include #include #include using namespace std; st..
[문제]: 7576번: 토마토 (acmicpc.net) 익은 토마토는 여러 곳에 동시에 있을 수 있다. 기억해야 할 것은 시작점이 여러 개인 BFS는 그냥 모든 시작점을 큐에 넣고 BFS 돌리면 끝이다. 방문 되었는지의 여부를 나타내는 배열이 아닌 거리(몇일 걸렸는지 나타내는 시간)를 의미하는 days배열임을 주의 할 것. 깊이가 1 증가할 때마다 days도 1씩 증가한다. #include #include #include using namespace std; int board[1002][1002]; int days[1002][1002]; int dx[4] = { 1, 0, -1, 0 }; int dy[4] = { 0, -1, 0, 1 }; int M, N; int main() { ios_base::syn..
[문제]: 1926번: 그림 (acmicpc.net) 그림의 좌상단에서부터 시작하여 1을 갖고, 방문한 적이 없는 모든 원소에 대해 BFS하면 끝난다. BFS의 기본적인 틀만 기억한다면 쉽게 이해 할 수 있다. area를 계산하는 위치도 눈여겨 보자. if문 바로 안에서 area 변수의 초깃값을 1로 주고 while()문 안에 있는 for()문 안에서 모든 if문을 건너뛰고 vis[nx][ny] = 1; 위 또는 아래줄에 ++area; 해주어도 된다. 다만 시간이 쬐금 더 소모된다. #include #include #include using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nul..
이 글은 Catalin의 블로그에 게시된 바 있는 Crash Course in HLSL을 번역한 것입니다. 번역본 링크(구글 docx): HLSL 둘러보기 - Google 문서 역자 - 박범준(mochanpowder@gmail.com) HLSL 둘러보기 HLSL이 무슨 뜻인가요? 왜 만들었죠? 이펙트(Effect) 파일은 어떻게 생겼나요? 이걸로 뭘 할 수 있죠? float4x4나 texcoord0, compile ps_3_0이 무슨 뜻입니까? 첫번째 질문의 답은 간단합니다 : HLSL은 고수준 쉐이더 언어(High Level Shader Language)라는 뜻입니다. 그렇다면 자연히 다음 질문이 떠오릅니다. 그에 대한 답을 다음 글에서 차근차근 짚어볼것입니다. 먼저 HLSL의 역사와 존재하게 된 배경..
[영상 21.3.1] 여러가지 오브젝트 그리기 공통 개념 1. 각 오브젝트의 클래스보다 더 중요한 것은, 그 오브젝트의 기하구조를 만드는 클래스이다. Geometry로 시작하는 클래스가 바로 이러한 클래스인데. 오브젝트 클래스는 결국 정점에 대해여 Bindable한 모든 것을 파이프라인에 바인드 하는 것이 하는 일이 거의 전부이다. 반면 Geometry~ 클래스는 실제 오브젝트의 구조를 결정짓고 정점의 인덱스 리스트까지 만들기 때문에 이 부분에 중점을 두고 살펴봐야 할 것이다. Box는 앞서 이미 보았으므로 생략했다. 2. Rasterizer Stage: 정점 파이프라인을 지나 출력된 프리미티브 데이터는 래스터라이저 스테이지에 보내져 래스터라이저에 의 해 렌더링 할 픽셀(텍셀)단위로 분해된다. 이때 래스..