응애맘마조
230818 강의 본문
저번에 말씀드린 대로 로딩씬에 대해 강의했습니다.
#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번으로 상수버퍼를 따로 추가했습니다.
이렇게 해서 페이드 아웃은 처리가 되었습니다.
매달 셋째 주 월요일은 공강이라서 따로 강의는 없습니다.
읽어주셔서 감사합니다.