이번엔, 커다란 박스를 하나 만들어서 그 안쪽에 큐브맵을 매핑할 것이다.

이를 이용하여, 배경을 만들어볼 생각이다.

 

void ResourceManager::LoadTexture(const std::string& _TextureName, ETextureType _Type)
{
    if (_Type == ETextureType::Diffuse)
    {
        LoadDiffuseTexture(_TextureName);
    }
    else if (_Type == ETextureType::CubeMap)
    {
        LoadCubeMapTexture(_TextureName);
    }
}

 

먼저 텍스쳐를 로드하는 곳에서 디퓨즈텍스쳐인지 큐브맵 텍스쳐인지 분류하여 로드하도록 하였다.

이유는 로드를 하면서 SRV까지 만들어주고 있는데, 큐브맵은 세팅을 조금 다르게 해야하기 때문이다.

void ResourceManager::LoadCubeMapTexture(const std::string& _TextureName)
{
    Microsoft::WRL::ComPtr<ID3D11Texture2D> Texture;
    Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> SRV;

    std::wstring Path = L"../Texture/";
    std::wstring TextureName;
    TextureName.assign(_TextureName.begin(), _TextureName.end());

    Path += TextureName;

    HRESULT Result = DirectX::CreateDDSTextureFromFileEx(
        EngineBase::GetInstance().GetDevice().Get(), Path.c_str(), 0, D3D11_USAGE_DEFAULT,
        D3D11_BIND_SHADER_RESOURCE, 0,
        D3D11_RESOURCE_MISC_TEXTURECUBE,
        DirectX::DDS_LOADER_FLAGS(false), (ID3D11Resource**)Texture.GetAddressOf(),
        SRV.GetAddressOf(), nullptr);

    if (Result != S_OK)
    {
        std::cout << "LoadCubeMapTexture failed " << std::endl;
        return;
    }

    TextureData NewTextureData;
    NewTextureData.Texture = Texture;
    NewTextureData.ShaderResourceView = SRV;

    LoadedTextures.insert({ _TextureName, NewTextureData });
}

 

큐브맵 텍스쳐를 로드하는 과정은 이와 같다.

큐브맵 텍스쳐를 로드하면서 DDS파일로 로드하다보니 코드가 위와 같아졌다.

 

그런데 구조가 조금 이상한 것 같다. 큐브맵 텍스쳐를 png로 사용할 수도 있고, 디퓨즈 텍스쳐를 dds로 사용할 수도 있기 때문에 조만간 텍스쳐 로드 과정을 수정할 계획이다.

 

 그리고 프로젝트 초반에 만들어두었던 박스형태의 매쉬를 사용할 것이다.

하지만, 기존의 매쉬는 상자 바깥부분에 텍스쳐를 매핑하고 있었지만, 큐브매핑을 하면서 안쪽에 텍스쳐를 매핑할 것이기 때문에 인덱스 버퍼를 뒤집어서 세팅해주었다.

 

그리고 큐브맵 전용 쉐이더도 하나 만들어주었다.

먼저, 빛과 같은 기능들은 모두 제거하고 트랜스폼만 상수버퍼로 전달해주었다.

버텍스 쉐이더는 기존과 동일한 코드로 만들었다. 완전히 동일한 코드이기 때문에 기존의 버텍스 쉐이더를 재활용해도 되지만, 나중에 큐브맵에만 적용할 무언가를 작성할 수도 있기 때문에 일단 분리하여 생성하였다.

 

픽셀 쉐이더는 아래와 같다.

struct PixelShaderInput
{
    float4 pos : SV_POSITION;
    float2 TexCoord : TEXCOORD;
    
    float3 WorldPos : POSITION1;
    float3 WorldNormal : NORMAL;
};

TextureCube CubeMapTexture : register(t0);
SamplerState Sampler : register(s0);

float4 main(PixelShaderInput _Input) : SV_TARGET
{
    float4 Color = CubeMapTexture.Sample(Sampler, _Input.WorldPos.xyz);
    return Color;
}

 

정말 간단하다. 텍스쳐를 세팅할 때 큐브맵 텍스쳐로 설정하였다면, 샘플링하면서 알아서 큐브맵 매핑을 해준다.

 

실행해서 확인을 해보자.

 

카메라가 박스 범위를 벗어나지만 않으면 잘 작동하는 듯 하다.

이렇게 큐브맵도 세팅을 해보았다!

다음엔 환경매핑을 해볼 예정이다.

+ Recent posts