24-03

Sandy·2024년 5월 2일

[Today I Learned]

목록 보기
15/18

240301_DepthStencil

DepthStencil

거울, 그림자

240302_Skybox

Skybox

Cube Mapping

UV 매핑 3D

3D Lookup Vector

Dynamic Cube Map

카메라 6개 만들어서 텍스쳐 6개 만든다

Normal Mapping

Displacement Map

240307_렌더링파이프라인

---
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

240308_동기화cpp

condition_var

waitfn 기다리게 wait() signalfn에서 notify_one()하면 깨어나서 다시 실행

여러 함수에서 동시 접근 → shared_var 필요, mutex로 보호하기, unique_lock 사용하기

Producer, Consumer

만드는 쪽 하나만 접근, 소비하는 쪽 하나만 접근, 추가되면 소비하는 쪽에 알려주기

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();
  
}

semaphore

리소스제한, 시그널 보내기

카운터 만큼 사용할 수 있다

acquire() release()

async, task

태스크 기반에 비동기 처리

알아서 처리하라고 추상화

future, promise

mutex, cv, ref, heap alloc을 내부적으로 처리해서 느리다

메인에서 받을 것을 실행시키고 그 결과를 나중에 준다

atomic

lock free

240310_tcp

Application

http 브라우저

Transport

tcp udp

Internet

ip

Network Access

이더넷

TCP 동작 과정

소켓 생성 → 3 way handshake → 데이터 송수신 → 4way handshake

DB 데드락

다음 트랜잭션 롤백, read write lock 해결하기

240315_effectivecpp

1. C++는 멀티 패러다임 언어이다

2. #define보다 const, enum, inline을 사용하자

3. const를 사용하자

4. 객체를 사용하기 전에 그 객체를 초기화 하자


5. 컴파일러는 default constructor, destructor, copy, move sematics를 자동으로 만든다

6. 컴파일러가 만들어낸 함수가 필요 없으면 private으로 막자

7. Polymorphic한 Base 클래스에서 destructor를 virtual로 선언하자

파생 클래스의 객체가 파괴될 때 올바른 소멸자가 호출되어 메모리 누수를 방지한다.

8. destructor는 예외를 던지면 안된다

9. 객체 생성 및 소멸 과정 중에는 virtual 함수를 호출하지 말자

derived 클래스의 멤버가 아직 초기화되지 않았거나 이미 파괴되었을 수 있기 때문이다.

10. operator=는 *this의 reference를 반환하게 하자

11. operator=에서는 자기대입에 대한 처리하자

12. copy constructor와 operator=는 따로 구현하자


13. RAII인 shared_ptr을 써서 자원관리하자

14. RAII copy에 대해 알고있자

RAII 객체를 복사할 때, 자원의 소유권이 공유될 수 있다.

15. RAII 클래스에서 자원 얻을 수 있게 API에게 열어주자

자원을 획득할 수 있는 공개적인 인터페이스를 제공해야 한다

16. new[]로 할당된 배열은 delete[]로, new로 할당된 개별 객체는 delete로 해제하기

메모리 해제 동작이 다르다

17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 한 문장으로 만들자

new로 생성한 객체를 스마트 포인터에 저장할 때는 동적으로 할당된 메모리를 해제해야 한다


18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 잘못 쓰기엔 어렵게 하자

19. 클래스 설계할 때 구조, 구현 생각하자

20. pass by 'value'보다는 pass by ‘const 참조’ 방식이 copy가 없다

21. 함수에서 지역변수, 임시객체를 반환해야 할 경우에 reference를 반환하면 안된다

22. private 영역에 변수를 선언하자

23. 멤버 함수보다는 비멤버 비프렌드 함수 사용하자

클래스의 캡슐화를 유지하고 외부에서 클래스의 내부 데이터에 접근을 제한한다

24. 비멤버 함수에서 타입변환을 하자

클래스의 캡슐화를 유지하고 외부에서 클래스의 내부 표현에 대한 의존성을 제거하

25. swap이 느리면 만들자


26. 변수 정의 나중에 해서 constructor, destructor 호출 줄이자

27. dynamic_cast 느리다

RTTI 사용해서 작동하기 때문이다.

28. 내부에서 사용하는 객체에 대한 ‘reference, pointer, iterator’ 반환 피하자

해당 객체의 내부 구현을 외부로 노출시키는 것과 같다.

29. 예외가 발생해도 메모리 누수나 데이터 손실 처리하자

30. inline 이해하자

함수 호출 오버헤드를 줄이기 위해 컴파일러가 해당 함수의 코드를 호출 지점에 직접 삽입하는 것이다.

31. 파일 사이의 컴파일 의존성을 최대로 줄이자

헤더 파일의 포함을 최소화하고 전방 선언과 인터페이스 추상화를 통해 의존성을 최대한 줄인다. 전방 선언을 사용하여 순환 의존성을 해결한다


32. public 상속은 "is-a"관계이다

33. 상속된 변수, 함수 이름을 숨기지말자

상속된 이름을 명시적으로 숨기는 대신, 다른 이름을 선택하거나 범위 지정 연산자를 사용하여 이름 충돌을 해결해야 한다

34. =0 과 virtual 함수는 다르다

순수 가상 함수는 파생 클래스에서 반드시 재정의해야 하는 함수로, 기본 구현이 없다.

35. virtual 함수 대신 템플릿 메서드 패턴, 함수 포인터, std::function, strategy 패턴을 쓸 수 있다

36. 상속받은 non-virtual 함수를 derived 클래스에서 override 하지 말자

37. 상속받은 default 매개변수값은 override 하지 말자

38. composition으로 is-implemented-in-terms-of 관계를 나타낸다

39. private 상속은 is-implemented-in-terms-of 이다

파생 클래스가 부모 클래스의 특성과 동작을 재사용하고, 그것들을 내부적으로 사용하거나 수정하기 위해 사용된다.

40. 다중 상속 하기 전에 필요한지 생각하자


41. template은 암시적 인터페이스를 지원하고 컴파일타임 다형성을 만든다

템플릿이 받아들이는 타입이 특정한 연산이나 메서드를 지원하도록 요구한다. 컴파일되는 시점에서 여러 타입에 대해 동일한 코드를 생성한다.

42. typename은 타입 이름이라는 것을 알려준다

43. derived클래스 template에서 base클래스 template에 이름 접근할 수 있다

44. 템플릿 매개변수에 관련없는 코드는 템플릿에서 분리하자

45. 멤버 함수 템플릿은 특정한 타입이 아닌, 다양한 타입의 객체를 다루는 함수를 작성한다

46. 클래스와 밀접하게 관련된 타입 변환을 정의할 때는 클래스 템플릿 안에 비멤버 함수를 정의한다

47. traits 클래스는 컴파일 도중에 주어진 타입에 대한 정보를 제공한다

48. 템플릿 메타프로그래밍은 컴파일 타임에 코드를 생성하고 실행한다


49. new handler는 메모리 할당 실패를 처리한다

50. new 및 delete를 바꿔서 메모리 관리 동작을 구현한다

51. new 및 delete를 구현할 때

메모리 할당 및 해제 동작은 상호 일치해야 하므로 new와 delete를 함께 구현한다

52. placement new를 만들면 placement delete도 만들자

특정한 메모리 위치에 객체를 생성하고 해당 메모리 위치에서 객체를 파괴하고 할당된 메모리를 해제한다


53. 컴파일러 경고 확인하자

54. 표준라이브러리 잘 쓰자

55. Boost 라이브러리 잘 쓰자

// 1197번 최소 스패닝 트리
/*
weight로 전체 에지 저장하기
전체 엣지 weight로 정렬하기
전체 노드 parent 정보 초기화
하나씩 사이클 만드는지 체크하면서 넣기

- 부모 찾으면 경로 압축해서 넣어서 최적화하기
*/

240316_위상정렬

// 2252번 줄 세우기
/*
- 위상정렬
차수카운팅
엣지 방향성 연결 정보 저장
q에 카운팅 정보로 노드 넣기
노드 빼면서 연결된 카운팅 정보 수정하기
*/
// 1806번 부분합
/*
-투포인터?
*/

240321_LongestCommonSubsequence

// 9252번 LCS 2
/*
스트링 입력
배열에서 일치하면 크게 테이블 만들기
변화하는 문자 찾아서 결과 추가하기
*/

240322_위상정렬

// 1005번 ACM Craft
/*
위상정렬
counts 로 앞에 몇 개 있는지 체크
connects로 내가 갖고있는 연결 노드
Ds로 몇 초 걸리는지
각 노드별로 cost 구하기
뺄 노드에서 연결된 모든 노드 구하기
연결 하나씩 빼주기
연결된 다른 것이 없으면 q에 넣기 
*/
// 1202번 보석 도둑 
/*
pq + greedy
가방 무게 작은 순부터 나열
가방 들어갈 수 있는 것 pq에 넣기
결과 더하기
시간초과 이유: 보석 가방에 넣을 때 전부 체크
- 보석 무게별로 정렬하기, 넣어야 할 범위만 목록에 넣기
- 가방에 넣는거 idx로 하다가 맨 뒤 넣는 조건 빠져서 계속 이상했다
*/

240323_LIS

// 12015번 가장 긴 증가하는 부분 수열 2
/*
길이만 유지한 채로 더 붙힐 수 있는 가능성 높히기
마지막 원소보다 크면 뒤에 붙히기
아니면 있는 원소 중에서 큰 것중에서 가장 작은 것과 바꾸기
- 이진탐색으로 속도 빠르게 하기
*/
// 9466번 텀 프로젝트
/*
dfs로 다시 돌아오면 visited 처리하기
스택에 계속 원소 쌓기
node랑 일치하면 전부 빼면서 visited 하기
- 메모리 초과 계속 돌면 발생, 안 된 것 처리 안하기
- 시간초과... 가지치기 필요한데 최적화 방법 모르겠다 
*/
// 1644번 소수의 연속합
/*
MAX 까지 벡터에 소수 넣어놓기
투포인터로 합 만들어지는 것 체크하기
*/

240324_unionfind

// 1647번 도시 분할 계획
/*
mst 만들기
union-find
- root인 두 노드를 합쳐야 한다 
- mst 만들고 가장 마지막 엣지 뺴야지 두 개로 분리된다 
- 경로압축 안해서 시간초과 났다 
*/
// 4386번 별자리 만들기
/*
mst
unionfind
피타고라스로 모든 엣지 길이 구하기
*/

240325_dp

// 2623번 음악프로그램
/*
위상정렬
순서 불가능할 경우 처리...?
*/
// 20040번 사이클 게임
/*
unionfind
false인 것 리턴하기
*/
// 17404번 RGB거리 2
/*
a b c 구하기
c i  = i-1 a / i-2 b
- dp식도 잘못되었다 
- 첫 조건 처리 모르겠다 
*/

240327_UPROPERTY

UPROPERTY

VisibleAnywhere, EditAnywhere

UCapsuleComponent

UStaticMeshComponent

USceneComponent

Livecoding

CreateDefaultSubobject<>()

EventGraph

BlueprintReadWrite

meta = (AllowPrivateAccess = "true")

Category = "Speed”

240328_UInputComponent

USpringArmComponent

UCameraComponent

GameFramework

BindAxis()

SetupPlayerInputComponent()

UInputComponent

UE_LOG()

TEXT(””)

AddActorLocalOffset()

DeltaTime

WorldContextObject

UGameplayStatics

GetWorldDeltaSeconds()

bSweep

AddActorLocalRotation()

FRotator

APlayerController

GetHitResultUnderCursor()

FHitResult

GetPlayerPawn()

BindAction

FTimerHandle

240329_UDamageType

TSubclassOf<>()

UProjectileMovementComponent

UFUNCTION()

UPrimitiveComponent

OnComponentHit.AddDynamic

UDamageType

OnTakeAnyDamage.AddDynamic()

GetInstigatorController()

UDamageType::StaticClass()

UGameplayStatics::ApplyDamage()

240330_투포인터

// 2467번 용액
/*
lowerbound로 하나 용액에서 다른 용액 일치 찾기
start ++하면서 lowerbound 찾기
값 용1 용2로 저장하기

- 안나누고 하나에서 처리하기
- 그냥 투포인터 문제였다 투포인터 + bs로 풀려고 했는데 아니었다
- 1퍼에서 틀렸다고 한다 왜일까 
- 조건 수정했다 
*/

240331_트리순회

// 2263번 트리의 순회
/*
po의 마지막이 root노드이다
io에서 root 찾아서 l r로 나눈다
재귀적으로 반복하면서 출력하기

- postorder, inorder 인덱스를 전부 넘겨야 한다
- parent의 위치가 섞이기 때문이다 

*/
//  2473번 세 용액
/*
두 개 고르고 하나 bs로 찾기 X
1개 고정, 투 포인터 사용하기

- 넘길 때 기존 선택한 것 말고 골라야 한다 X
*/

0개의 댓글