기존 Mesh가 들고 있던 Shader, Texture를 하나로 통합하여 관리 => Material
해당 리소스들은 어떤 물체를 나타낼 때 사용되는데
해당 물체가 여러 개 표현되어야할 때도 하나만 있으면 됨 => 재사용
Mesh가 바뀌어도 해당 material을 사용할 수 있음
(normal map: 빛 반사 텍스쳐로 음영 및 질감 표현)
material 사용 시 constant buffer를 통하여 vertex와 데이터들을 전달하기 위해
constant buffer를 수정
void ConstantBuffer::Init(CBV_REGISTER reg, uint32 size, uint32 count)
{
_reg = reg;
...
}
void ConstantBuffer::PushData(void* buffer, uint32 size)
{
...
D3D12_CPU_DESCRIPTOR_HANDLE cpuHandle = GetCpuHandle(_currentIndex);
GEngine->GetTableDescHeap()->SetCBV(cpuHandle, _reg);
_currentIndex++;
}
constant buffer를 초기화 시 어떤 레지스터에 대한 버퍼인지 받아 저장 후
데이터를 넣을 때 해당 레지스터에 대한 CBV를 설정하도록 수정
cbuffer MATERIAL_PARAMS : register(b1)
{
int int_0;
int int_1;
int int_2;
int int_3;
int int_4;
float float_0;
float float_1;
float float_2;
float float_3;
float float_4;
};
Texture2D tex_0 : register(t0);
Texture2D tex_1 : register(t1);
Texture2D tex_2 : register(t2);
Texture2D tex_3 : register(t3);
Texture2D tex_4 : register(t4);
쉐이더 파일에서 데이터들과 텍스쳐 설정
enum
{
MATERIAL_INT_COUNT = 5,
MATERIAL_FLOAT_COUNT = 5,
MATERIAL_TEXTURE_COUNT = 5,
};
struct MaterialParams
{
void SetInt(uint8 index, int32 value) { intParams[index] = value; }
void SetFloat(uint8 index, float value) { floatParams[index] = value; }
array<int32, MATERIAL_INT_COUNT> intParams;
array<float, MATERIAL_FLOAT_COUNT> floatParams;
};
class Material
{
public:
...
private:
shared_ptr<Shader> _shader;
MaterialParams _params;
array<shared_ptr<Texture>, MATERIAL_TEXTURE_COUNT> _textures;
};
Material 클래스에서 쉐이더의 자료에 맞도록 구현
void Material::Update()
{
CONST_BUFFER(CONSTANT_BUFFER_TYPE::MATERIAL)->PushData(&_params, sizeof(_params));
for (size_t i = 0; i < _textures.size(); i++)
{
...
SRV_REGISTER reg = SRV_REGISTER(static_cast<int8>(SRV_REGISTER::t0) + i);
GEngine->GetTableDescHeap()->SetSRV(_textures[i]->GetCpuHandle(), reg);
}
_shader->Update();
}
Material 클래스가 업데이트 때마다 CBV와 SRV를 설정 후 렌더링되도록 구현
void Mesh::Render()
{
...
CONST_BUFFER(CONSTANT_BUFFER_TYPE::TRANSFORM)->PushData(&_transform, sizeof(_transform));
_mat->Update();
...
}
mesh가 들고 있던 texture를 material로 수정 후
메쉬가 렌더링 시 들고 있는 material을 업데이트하도록 수정