Material
- 주로 유니티에서 사용되며, 셰이더와 텍스처, 그리고 Mesh 삼총사를 합쳐서 관리하는 Component이다.
#pragma once
class Shader;
class Texture;
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:
shared_ptr<Shader> GetShader() { return _shader; }
void SetShader(shared_ptr<Shader> shader) { _shader = shader; }
void SetInt(uint8 index, int32 value) { _params.SetInt(index, value); }
void SetFloat(uint8 index, float value) { _params.SetFloat(index, value); }
void SetTexture(uint8 index, shared_ptr<Texture> texture) { _textures[index] = texture; }
void Update();
private:
shared_ptr<Shader> _shader;
MaterialParams _params;
array<shared_ptr<Texture>, MATERIAL_TEXTURE_COUNT> _textures;
};
위 코드를 보면
shared_ptr<Mesh> mesh = make_shared<Mesh>();
shared_ptr<Shader> shader = make_shared<Shader>();
shared_ptr<Texture> texture = make_shared<Texture>();
를 통하여 mesh와 shader texture를 관리하고 있는 것을 알 수 있다.
#include "pch.h"
#include "Material.h"
#include "Engine.h"
void Material::Update()
{
CONST_BUFFER(CONSTANT_BUFFER_TYPE::MATERIAL)->PushData(&_params, sizeof(_params));
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);
GEngine->GetTableDescHeap()->SetSRV(_textures[i]->GetCpuHandle(), reg);
}
_shader->Update();
}
- 구현 부분은 매우 간단하다.
- 일단 Materual에 대한 상수버퍼를 업로드하여 사용할 메모리를 할당한다.
- 그 후 SRV_REGISTER에 사용할 Texture를 넘겨주고 shader을 Update한다.
결론: Material을 사용하면 Rendering 과정의 Shader, Mesh, Texture 세팅을 좀더 깔끔하게 관리할 수 있다.