Material

ㅋㅋ·2022년 7월 19일
0

DirectX12강의

목록 보기
11/39

기존 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을 업데이트하도록 수정

0개의 댓글