[DirectX12] 📂. Material
🔷 Material
- 물체를 구성하는 물질 또는 물질의 혼합물
1. Material Class
- Shader, Texture 그리고 그 외의 상수값(Material Params)를 묶어서 관리해주는 클래스
- 기존에 하나씩 넘겨주던 값들을 Material이라는 클래스로 묶어서 관리
Material Params
- CBV로 생성되며 int값 5개, float값 5개, texturer값 5개로 생성한다.
- MaterialParams라는 구조체(struct)를 이용하여 int와 float값을 관리한다.
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,
};
// b1 register로 한꺼번에 넘기기 위해 Texture는 함께 묶지 않는다.
struct MaterialConstantParams
{
void SetIntParam(uint8 index, int32 value) { intParams[index] = value; }
void SetFloatParam(uint8 index, float value) { floatParams[index] = value; }
array<int32, MATERIAL_INT_COUNT> intParams = { 0, 0, 0, 0, 0 };
array<float, MATERIAL_FLOAT_COUNT> floatParams = { 0.f, 0.f, 0.f, 0.f, 0.f };
};
class Material
{
...
private:
shared_ptr<Shader> _shader;
MaterialConstantParams _params;
array<shared_ptr<Texture>, MATERIAL_TEXTURE_COUNT> _textures = {};
};
// CBV
MyEngine->GetConstantBuffer(CONSTANT_BUFFER_TYPE::MATERIAL)->PushData(&_params, sizeof(_params));
// SRV
for (size_t i = 0; i < _textures.size(); i++)
{
if (_textures[i] == nullptr)
continue;
SRV_REGISTER reg = SRV_REGISTER(static_cast<int8>(SRV_REGISTER::t0) + i);
MyEngine->GetTableDescriptorHeap()->SetShaderResourceView(_textures[i]->GetCpuHandle(), reg);
}
// Shader
_shader->Update();
2. Constant Buffer 나누기
- Material로 인해 용도별로 ConstantBuffer를 분리
- Engine에서 ConstantBuffer값을 가져올 때, Type으로 선별하여 가져온다.
enum class CONSTANT_BUFFER_TYPE : uint8
{
TRANSFORM, // b0
MATERIAL, // b1
END // CONSTANT_BUFFER_COUNT
};
array<shared_ptr<ConstantBuffer>, CONSTANT_BUFFER_COUNT> _constantBuffers;
shared_ptr<ConstantBuffer> GetConstantBuffer(CONSTANT_BUFFER_TYPE type)
{
return _constantBuffers[static_cast<uint8>(type)];
}
3. Mesh에 Material로 정리하기
class Mesh
{
...
private:
Transform _transform = {};
shared_ptr<Material> _material;
};
🔹 결과
- 물체의 pos의 x, y, z값에 float_0, float_1, float_2 값을 적용시켜 테스트 하였을 때, 값이 적용된 결과값이 나왔다.
댓글남기기