[DirectX] 상수버퍼 어쩌구

라멘커비·2024년 4월 3일
0

DirectX 2D

목록 보기
9/24

엔진 - 상수버퍼 사용 추가

상수버퍼 개요

ColorShader에서도 OutPutColor라는 상수버퍼 만듦. 근데 내용이 그냥 float4 Color가 끝. ImageShader의 ResultColor와 같음. 상수버퍼는 이름이 중요한 게 아니라 바이트가 중요하다. 그래서 두 상수버퍼는 완전히 서로 대체될 수 있다. → 따로 만든 것은 낭비임. 하나로 쓸 수 있음. 안에 들어가는 데이터만 바꿔서 또 쓰면 된다.

근데 그럼 기존의 방법으로 쓰면 상수버퍼를 중복해서 여러번만드는게 됨. 엔진에서 Resource부모 클래스에있는 Name으로 관리하는 방법만으로 관리가 안 됨.

같은 상수버퍼를 같은 슬롯 다른 쉐이더에 넣는 것은 가능하다.

⇒ 같은 A상수버퍼를 버텍스 쉐이더의 B0슬롯, 픽셀 쉐이더의 0번 슬롯에 넣는 건 된다. 두 개 만들 필요 X.

(A상수버퍼를 버텍스쉐이더의 b0, b1 슬롯에 둘 다 넣는 것은 안 됨)

(한 슬롯에 여러 상수버퍼 넣는 것도 (상식적으로) 안 됨)

이름은 같은데 내용이 다른 상수버퍼는 허용할지 말지 정하면 됨. 이거에 따라 관리할 때 사용할 자료구조 선택이 달라질 수 있음.

→ 이름이 같은 것 자체를 허용하지 않는다 vs 이름이 같으면 구조가 무조건 같아야 한다

우리가 알 수 있는 상수버퍼 데이터

  • 슬롯 b0 b1 b2 (0,1,2 .. 정수로 알 수 O)
  • 쉐이더 종류 (EShaderType::Pixel)
  • 쉐이더 이름 (ColorShader.fx)
  • 바이트 크기
  • 상수버퍼 이름 “FTransform”

내 생각

  • Map 키 (쉐이더 종류) - 값(상수버퍼 이름) << 이러면 다른 쉐이더에 있는 상수버퍼 못쓰는건가?

이름 중복 안 되는 것도 단점이 이씀. 내용이 다른 같은 이름의 버퍼를 만들 수가 없음. 규칙을 기억 못하고 만들 수 있음.

  • Map < 키(상수버퍼 이름) - 값 (Map<키(바이트크기) - 값(상수버퍼)>) >

같은 이름의 상수버퍼 들어왔을 때 값비교해서 같으면 있는 거 사용, 크기 다르면 새로 등록

→ 이거 채택됨!!!!

→ 이거는 이름같지만 변수 몇개 빼서 크기가 달라진 건 따로 만들어짐

→ 근데 앞에 맵으로 한 번 더 씌움 ㅋㅋ 쉐이더 종류 키 추가함!!

상수버퍼 내용 채우기

  • ResCreate함수

FTransform는 한 번 값이 정해지면 바꿀 일이 없는 메쉬와 달리 계속 바뀌고 업데이트해줘야 하는 값임. 그래서 초기값 의미 없음.

CPUAccessFlags CPU에서 접근 가능해야 함

  • ex) Player Tick에서

Renderer→SetConstantBuffer(”FTransform”, GetTransform()); 이런식으로 계속 넣어주면 됨.

근데 이렇게 안하고 Setter로 함

Setter

  • 상수버퍼를 또 Setter클래스로 감쌈. 왜?

⇒ 액터가 3개면 FTransform 3개. 근데 상수버퍼는 1개. 각 액터마다 데이터 세팅할 수 있게 하려고..

class UEngineConstantBufferSetter
{
public:
	std::shared_ptr<class UEngineConstantBuffer> Res;
	// 각 액터마다 가지고 있는 데이터를 세팅할 녀석
	const void* SettingCPU = nullptr;
};

액터 여러개인데 상수버퍼 하나로 하면 마지막에 세팅된 값으로 다같이 공유됨. 그래서 트랜스폼 세팅데이터 라는 단계를 하나 추가해서 각각의 액터마다 Setter를 추가해서 자기가 갖고 있는 액터가 업데이트돼야할 때 세팅해주는 거임.

profile
일단 시작해보자

0개의 댓글