Material

이승덱·2021년 7월 30일
0

Graphics&DirectX

목록 보기
12/37

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()
{
	// CBV 업로드
	CONST_BUFFER(CONSTANT_BUFFER_TYPE::MATERIAL)->PushData(&_params, sizeof(_params));	// Material CBV 업로드

	// 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);	
		GEngine->GetTableDescHeap()->SetSRV(_textures[i]->GetCpuHandle(), reg);
	}

	// 파이프라인 세팅
	_shader->Update();
}
  • 구현 부분은 매우 간단하다.
  • 일단 Materual에 대한 상수버퍼를 업로드하여 사용할 메모리를 할당한다.
  • 그 후 SRV_REGISTER에 사용할 Texture를 넘겨주고 shader을 Update한다.

결론: Material을 사용하면 Rendering 과정의 Shader, Mesh, Texture 세팅을 좀더 깔끔하게 관리할 수 있다.

profile
공부 기록용 블로그입니다

0개의 댓글