ColorShader에서도 OutPutColor라는 상수버퍼 만듦. 근데 내용이 그냥 float4 Color가 끝. ImageShader의 ResultColor와 같음. 상수버퍼는 이름이 중요한 게 아니라 바이트가 중요하다. 그래서 두 상수버퍼는 완전히 서로 대체될 수 있다. → 따로 만든 것은 낭비임. 하나로 쓸 수 있음. 안에 들어가는 데이터만 바꿔서 또 쓰면 된다.
근데 그럼 기존의 방법으로 쓰면 상수버퍼를 중복해서 여러번만드는게 됨. 엔진에서 Resource부모 클래스에있는 Name으로 관리하는 방법만으로 관리가 안 됨.
같은 상수버퍼를 같은 슬롯 다른 쉐이더에 넣는 것은 가능하다.
⇒ 같은 A상수버퍼를 버텍스 쉐이더의 B0슬롯, 픽셀 쉐이더의 0번 슬롯에 넣는 건 된다. 두 개 만들 필요 X.
(A상수버퍼를 버텍스쉐이더의 b0, b1 슬롯에 둘 다 넣는 것은 안 됨)
(한 슬롯에 여러 상수버퍼 넣는 것도 (상식적으로) 안 됨)
이름은 같은데 내용이 다른 상수버퍼는 허용할지 말지 정하면 됨. 이거에 따라 관리할 때 사용할 자료구조 선택이 달라질 수 있음.
→ 이름이 같은 것 자체를 허용하지 않는다 vs 이름이 같으면 구조가 무조건 같아야 한다
이름 중복 안 되는 것도 단점이 이씀. 내용이 다른 같은 이름의 버퍼를 만들 수가 없음. 규칙을 기억 못하고 만들 수 있음.
같은 이름의 상수버퍼 들어왔을 때 값비교해서 같으면 있는 거 사용, 크기 다르면 새로 등록
→ 이거 채택됨!!!!
→ 이거는 이름같지만 변수 몇개 빼서 크기가 달라진 건 따로 만들어짐
→ 근데 앞에 맵으로 한 번 더 씌움 ㅋㅋ 쉐이더 종류 키 추가함!!
FTransform는 한 번 값이 정해지면 바꿀 일이 없는 메쉬와 달리 계속 바뀌고 업데이트해줘야 하는 값임. 그래서 초기값 의미 없음.
CPUAccessFlags CPU에서 접근 가능해야 함
Renderer→SetConstantBuffer(”FTransform”, GetTransform()); 이런식으로 계속 넣어주면 됨.
근데 이렇게 안하고 Setter로 함
⇒ 액터가 3개면 FTransform 3개. 근데 상수버퍼는 1개. 각 액터마다 데이터 세팅할 수 있게 하려고..
class UEngineConstantBufferSetter
{
public:
std::shared_ptr<class UEngineConstantBuffer> Res;
// 각 액터마다 가지고 있는 데이터를 세팅할 녀석
const void* SettingCPU = nullptr;
};
액터 여러개인데 상수버퍼 하나로 하면 마지막에 세팅된 값으로 다같이 공유됨. 그래서 트랜스폼 세팅데이터 라는 단계를 하나 추가해서 각각의 액터마다 Setter를 추가해서 자기가 갖고 있는 액터가 업데이트돼야할 때 세팅해주는 거임.