거울, 그림자
UV 매핑 3D
카메라 6개 만들어서 텍스쳐 6개 만든다
---
marp: true
---
# **렌더링 파이프라인**
## DX11 물방울책
이서영
---
# 목차
* 렌더링 파이프라인
* swapchain
* index buffer
* uv mapping
* ambient / diffuse / specular
* frustum culling
* normal mapping
* animation
---
# 렌더링 파이프라인
### 렌더링
### 파이프라인
### CPU / GPU
---
# 렌더링 파이프라인
### local - world - view - projection
---
# swapchain
### 프런트 / 백 버퍼
### 더블 버퍼링
### present()
---
# index buffer
### Input Assembler
### Vertex / Index
### Vertex data
---
# index buffer
### Vertex Shader
---
# ambient / diffuse / specular
### Pixel Shader - 빛의 세기
### ambient
### diffuse
### specular
---
# ambient / diffuse / specular
### 벡터
### 노말
### cos / 내적 / 투영
---
# ambient / diffuse / specular
### specular
### half vector
---
# uv mapping
### uv 좌표
### Pixel Shader - 기본색
### 텍스쳐
### 메테리얼
---
# frustum culling
### 카메라 영역
### near far plane
---
# frustum culling
### CPU / 렌더링 파이프라인
### cliping
---
# frustum culling
### 점 - 면 테스트
### octree
---
# normal mapping
### Pixel Shader - 디테일
### 하이 폴리곤 로우 폴리곤
### normal map
---
# normal mapping
### 노말 - inverse transposed
### tangent space
### 파란색 텍스쳐
---
# animation
### 스키닝
### fbx 파일
---
# animation
### Object - Component
### 애니메이터
### 애니메이션
---
# animation
### keyframe
### hierarchical bone 구조
---
# animation
### bone - vertex
### parent - child transform
---
# animation
### lerp
waitfn 기다리게 wait() signalfn에서 notify_one()하면 깨어나서 다시 실행
여러 함수에서 동시 접근 → shared_var 필요, mutex로 보호하기, unique_lock 사용하기
만드는 쪽 하나만 접근, 소비하는 쪽 하나만 접근, 추가되면 소비하는 쪽에 알려주기
class StrStack
{
public:
void addStr(std::string s)
{
{
std::lock_guard<std::mutex> lck(mMtx);
mStrs.emplace_back(std::move(s));
}
mCv.notify_one();
}
std::string getStr()
{
std::unique_lock<std::mutex> lck(mMtx);
while(mStrs.empty())
{
mCv.wait(lck);
}
std::string s = std::move(mStrs.back());
mStrs.pop_back();
lck.unlock();
return s;
}
private:
std::vector<std::string> mStrs;
std::mutex mMtx;
std::condition_variable mCv;
}
int main()
{
StrStack strStack;
std::thread t1([&](){
strStack.addStr("pro1");
});
std::thread t2([&](){
strStack.addStr("pro2");
});
std::thread t3([&](){
std::cout << strStack.getStr() << "\n";
});
t1.join();
t2.join();
t3.join();
}
리소스제한, 시그널 보내기
카운터 만큼 사용할 수 있다
acquire() release()
태스크 기반에 비동기 처리
알아서 처리하라고 추상화
mutex, cv, ref, heap alloc을 내부적으로 처리해서 느리다
메인에서 받을 것을 실행시키고 그 결과를 나중에 준다
lock free
http 브라우저
tcp udp
ip
이더넷
소켓 생성 → 3 way handshake → 데이터 송수신 → 4way handshake
다음 트랜잭션 롤백, read write lock 해결하기
파생 클래스의 객체가 파괴될 때 올바른 소멸자가 호출되어 메모리 누수를 방지한다.
derived 클래스의 멤버가 아직 초기화되지 않았거나 이미 파괴되었을 수 있기 때문이다.
RAII 객체를 복사할 때, 자원의 소유권이 공유될 수 있다.
자원을 획득할 수 있는 공개적인 인터페이스를 제공해야 한다
메모리 해제 동작이 다르다
new로 생성한 객체를 스마트 포인터에 저장할 때는 동적으로 할당된 메모리를 해제해야 한다
클래스의 캡슐화를 유지하고 외부에서 클래스의 내부 데이터에 접근을 제한한다
클래스의 캡슐화를 유지하고 외부에서 클래스의 내부 표현에 대한 의존성을 제거하
RTTI 사용해서 작동하기 때문이다.
해당 객체의 내부 구현을 외부로 노출시키는 것과 같다.
함수 호출 오버헤드를 줄이기 위해 컴파일러가 해당 함수의 코드를 호출 지점에 직접 삽입하는 것이다.
헤더 파일의 포함을 최소화하고 전방 선언과 인터페이스 추상화를 통해 의존성을 최대한 줄인다. 전방 선언을 사용하여 순환 의존성을 해결한다
상속된 이름을 명시적으로 숨기는 대신, 다른 이름을 선택하거나 범위 지정 연산자를 사용하여 이름 충돌을 해결해야 한다
순수 가상 함수는 파생 클래스에서 반드시 재정의해야 하는 함수로, 기본 구현이 없다.
파생 클래스가 부모 클래스의 특성과 동작을 재사용하고, 그것들을 내부적으로 사용하거나 수정하기 위해 사용된다.
템플릿이 받아들이는 타입이 특정한 연산이나 메서드를 지원하도록 요구한다. 컴파일되는 시점에서 여러 타입에 대해 동일한 코드를 생성한다.
메모리 할당 및 해제 동작은 상호 일치해야 하므로 new와 delete를 함께 구현한다
특정한 메모리 위치에 객체를 생성하고 해당 메모리 위치에서 객체를 파괴하고 할당된 메모리를 해제한다
// 1197번 최소 스패닝 트리
/*
weight로 전체 에지 저장하기
전체 엣지 weight로 정렬하기
전체 노드 parent 정보 초기화
하나씩 사이클 만드는지 체크하면서 넣기
- 부모 찾으면 경로 압축해서 넣어서 최적화하기
*/
// 2252번 줄 세우기
/*
- 위상정렬
차수카운팅
엣지 방향성 연결 정보 저장
q에 카운팅 정보로 노드 넣기
노드 빼면서 연결된 카운팅 정보 수정하기
*/
// 1806번 부분합
/*
-투포인터?
*/
// 9252번 LCS 2
/*
스트링 입력
배열에서 일치하면 크게 테이블 만들기
변화하는 문자 찾아서 결과 추가하기
*/
// 1005번 ACM Craft
/*
위상정렬
counts 로 앞에 몇 개 있는지 체크
connects로 내가 갖고있는 연결 노드
Ds로 몇 초 걸리는지
각 노드별로 cost 구하기
뺄 노드에서 연결된 모든 노드 구하기
연결 하나씩 빼주기
연결된 다른 것이 없으면 q에 넣기
*/
// 1202번 보석 도둑
/*
pq + greedy
가방 무게 작은 순부터 나열
가방 들어갈 수 있는 것 pq에 넣기
결과 더하기
시간초과 이유: 보석 가방에 넣을 때 전부 체크
- 보석 무게별로 정렬하기, 넣어야 할 범위만 목록에 넣기
- 가방에 넣는거 idx로 하다가 맨 뒤 넣는 조건 빠져서 계속 이상했다
*/
// 12015번 가장 긴 증가하는 부분 수열 2
/*
길이만 유지한 채로 더 붙힐 수 있는 가능성 높히기
마지막 원소보다 크면 뒤에 붙히기
아니면 있는 원소 중에서 큰 것중에서 가장 작은 것과 바꾸기
- 이진탐색으로 속도 빠르게 하기
*/
// 9466번 텀 프로젝트
/*
dfs로 다시 돌아오면 visited 처리하기
스택에 계속 원소 쌓기
node랑 일치하면 전부 빼면서 visited 하기
- 메모리 초과 계속 돌면 발생, 안 된 것 처리 안하기
- 시간초과... 가지치기 필요한데 최적화 방법 모르겠다
*/
// 1644번 소수의 연속합
/*
MAX 까지 벡터에 소수 넣어놓기
투포인터로 합 만들어지는 것 체크하기
*/
// 1647번 도시 분할 계획
/*
mst 만들기
union-find
- root인 두 노드를 합쳐야 한다
- mst 만들고 가장 마지막 엣지 뺴야지 두 개로 분리된다
- 경로압축 안해서 시간초과 났다
*/
// 4386번 별자리 만들기
/*
mst
unionfind
피타고라스로 모든 엣지 길이 구하기
*/
// 2623번 음악프로그램
/*
위상정렬
순서 불가능할 경우 처리...?
*/
// 20040번 사이클 게임
/*
unionfind
false인 것 리턴하기
*/
// 17404번 RGB거리 2
/*
a b c 구하기
c i = i-1 a / i-2 b
- dp식도 잘못되었다
- 첫 조건 처리 모르겠다
*/
VisibleAnywhere, EditAnywhere
// 2467번 용액
/*
lowerbound로 하나 용액에서 다른 용액 일치 찾기
start ++하면서 lowerbound 찾기
값 용1 용2로 저장하기
- 안나누고 하나에서 처리하기
- 그냥 투포인터 문제였다 투포인터 + bs로 풀려고 했는데 아니었다
- 1퍼에서 틀렸다고 한다 왜일까
- 조건 수정했다
*/
// 2263번 트리의 순회
/*
po의 마지막이 root노드이다
io에서 root 찾아서 l r로 나눈다
재귀적으로 반복하면서 출력하기
- postorder, inorder 인덱스를 전부 넘겨야 한다
- parent의 위치가 섞이기 때문이다
*/
// 2473번 세 용액
/*
두 개 고르고 하나 bs로 찾기 X
1개 고정, 투 포인터 사용하기
- 넘길 때 기존 선택한 것 말고 골라야 한다 X
*/