응애맘마조

230818 강의 본문

공부/3D강의

230818 강의

TH.Wert 2023. 8. 21. 21:53

저번에 말씀드린 대로 로딩씬에 대해 강의했습니다.

#pragma once
class LoadingScene : public Scene
{
private:
	Camera*		cam;
	UI*				ui;
	RenderTarget*	RTT;
	Actor*			postEffect;

	thread*			t1;

	ID3D11Buffer*	PEBuffer;
	struct PSP
	{
		Vector2 point;
		float radius;
		int count;
	} psp;

public:
	LoadingScene();
	~LoadingScene();
	virtual void Init() override;
	virtual void Release() override;
	virtual void Update() override;
	virtual void LateUpdate() override;
	virtual void Render() override;
	virtual void PreRender() override;
	virtual void ResizeScreen() override;
};
#include "stdafx.h"
#include "LoadingScene.h"
#include "Scene2.h"

string initObject;
int     initCount;

void Func22()
{
    SCENE->AddScene("SC2", new Scene2());
    SCENE->GetScene("SC2")->Init();
}

LoadingScene::LoadingScene()
{
}

LoadingScene::~LoadingScene()
{
}

void LoadingScene::Init()
{
    ui = UI::Create();
    ui->LoadFile("UI.xml");

    RTT = new RenderTarget();
    postEffect = Actor::Create();
    postEffect->LoadFile("PostEffect.xml");
    
    cam = Camera::Create();
    cam->LoadFile("Cam.xml");
    Camera::main = cam;

    Camera::main->width = App.GetWidth();
    Camera::main->height = App.GetHeight();
    Camera::main->viewport.width = App.GetWidth();
    Camera::main->viewport.height = App.GetHeight();

    //별도 스레드 동작
    t1 = new thread(Func22);

    {
        D3D11_BUFFER_DESC desc = { 0 };
        desc.ByteWidth = sizeof(Vector4);
        desc.Usage = D3D11_USAGE_DYNAMIC;
        desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//상수버퍼
        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
        desc.MiscFlags = 0;
        desc.StructureByteStride = 0;
        HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, NULL, &PEBuffer);
        assert(SUCCEEDED(hr));

    }

    psp.point.x = App.GetHalfWidth();
    psp.point.y = App.GetHalfHeight();
    psp.radius = 1200.0f;
}

void LoadingScene::Release()
{
}

void LoadingScene::Update()
{
    ImGui::Begin("Hierarchy");
    ui->RenderHierarchy();
    ImGui::End();

    ui->Find("None")->scale.x = initCount / 9.0f;

    ui->Update();
    postEffect->Update();
    Camera::main->Update();
    Camera::ControlMainCam();
}

void LoadingScene::LateUpdate()
{
    if (initCount == 9)
    {
        SCENE->ChangeScene("SC2", 2.0f);
        initCount++;
    }

    if (SCENE->GetScene("LOADING")->state == SceneState::FADEOUT)
    {
        psp.radius -= 600.0f * DELTA;
    }
}

void LoadingScene::Render()
{
    wstring str = Util::ToWString(initObject) + to_wstring(initCount);
    DWRITE->RenderText(str, RECT{0, 0, 800, 800},40,L"궁서체",Color(1,0,0,1));

    RTT->SetRGBTexture(1);

    {
        D3D11_MAPPED_SUBRESOURCE mappedResource;
        D3D->GetDC()->Map(PEBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
        memcpy_s(mappedResource.pData, sizeof(Vector4), &psp, sizeof(Vector4));
        D3D->GetDC()->Unmap(PEBuffer, 0);
        D3D->GetDC()->PSSetConstantBuffers(11, 1, &PEBuffer);
    }
    postEffect->Render();
}

void LoadingScene::PreRender()
{
    LIGHT->Set();
    Camera::main->Set();
    RTT->SetTarget(Color(0, 0, 0, 1));
    ui->Render();
}

void LoadingScene::ResizeScreen()
{
    Camera::main->width = App.GetWidth();
    Camera::main->height = App.GetHeight();
    Camera::main->viewport.width = App.GetWidth();
    Camera::main->viewport.height = App.GetHeight();
}

이번에는 상수버퍼를 따로 만들어서 로딩만 할 수 있도록 하는 장면만을 따로 만들었습니다.

cbuffer PS_PostEffect : register(b11)
{
	float2	_Screen;
	float	_Radius;
	int	    count;
}

hlsl 안에 11번으로 상수버퍼를 따로 추가했습니다.

로딩과 같이 바를 추가한 모습

이렇게 해서 페이드 아웃은 처리가 되었습니다.

 

매달 셋째 주 월요일은 공강이라서 따로 강의는 없습니다.

읽어주셔서 감사합니다.

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

230823 강의  (0) 2023.08.23
230822 강의  (0) 2023.08.22
230817 강의  (0) 2023.08.17
230816 강의  (0) 2023.08.16
230814 강의  (0) 2023.08.14