응애맘마조

230807 강의 본문

공부/3D강의

230807 강의

TH.Wert 2023. 8. 7. 18:33

학원 휴무가 끝나고 environment에 대해 강의했습니다.

#pragma once
class MaterialBuffer
{
public:
	Color	ambient;
	Color	diffuse;
	Color	specular;
	Color	emissive;
	float	shininess;
	float	opacity;
	float   environment;
	float	shadow;
};
class Material : public MaterialBuffer
{
	static ID3D11Buffer* materialBuffer;
public:
	static void CreateStaticMember();
	static void DeleteStaticMember();
public:
	shared_ptr<Texture>			normalMap;
	shared_ptr<Texture>			diffuseMap;
	shared_ptr<Texture>			specularMap;
	shared_ptr<Texture>			emissiveMap;
	string						file;
public:
	Material();
	~Material();

	void RenderDetail();
	virtual void Set();
	void LoadFile(string file);
	void SaveFile(string file);
};

사전적 정의로는 환경이라는 의미를 가지고 있으며 환경 매핑이라고 하는데 미러볼처럼 반사되는 매핑에 사용됩니다. 큐브맵 안에서 구체 오브젝트가 있을 때 각 맵의 면에 나타낸 환경의 이미지를 구체형에 보이도록 해주는 방식입니다. 이는 각 면의 텍스쳐가 고정이기 때문에 정적 환경 매핑이라고 합니다. 정적의 반대는 동적인데 동적 환경 매핑은 이 구체형 안에서도 플레이어가 움직일 때도 움직이는 모습을 보여주거나 할 때 사용됩니다. 이 안에서도 매 프레임마다 렌더링이 들어가기 때문에 연산되는 양이 많아집니다.

float3 EnvironmentMapping(float3 Normal, float3 wPosition)
{
	 [flatten]
	if (environment != 0.0f)
	{
		float3 ViewDir = normalize(wPosition - ViewPos.xyz);
		float3 reflection = reflect(ViewDir, Normal);
		
		return TextureBG.Sample(SamplerBG, reflection.xyz) * environment;
	}
	return float3(0, 0, 0);
}

hlsl에 환경 매핑에 대한 코드를 추가했습니다. 아직 여기에 추가되어야 하는 코드가 더 있지만 나머지는 내일 이어서 한다고 했습니다. 카메라가 바라보는 방향과 노멀을 사용해서 반사값을 얻어냅니다.

Result.rgb += EnvironmentMapping(Normal, wPosition);

여기에서는 노멀하고 월드상 위치값만 받아서 환경 매핑을 하게 됩니다. 이 코드를 가지고 이전에 만들었던 구체를 렌더링 하고 환경 매핑을 하게 됩니다.

환경 매핑이 된 구체의 모습

여기에 위에 작성했던 미러볼이나 캐릭터의 메탈로 된 부분을 표현할 때 사용하기에 적절한 것 같습니다.

 

읽어주셔서 감사합니다.

'공부 > 3D강의' 카테고리의 다른 글

230816 강의  (0) 2023.08.16
230814 강의  (0) 2023.08.14
230801 강의  (0) 2023.08.01
230731 강의  (0) 2023.07.31
230728 강의  (0) 2023.07.28