응애맘마조
230807 강의 본문
학원 휴무가 끝나고 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);
여기에서는 노멀하고 월드상 위치값만 받아서 환경 매핑을 하게 됩니다. 이 코드를 가지고 이전에 만들었던 구체를 렌더링 하고 환경 매핑을 하게 됩니다.
여기에 위에 작성했던 미러볼이나 캐릭터의 메탈로 된 부분을 표현할 때 사용하기에 적절한 것 같습니다.
읽어주셔서 감사합니다.