응애맘마조
230912 강의 본문
그림자 매핑을 강의했습니다.
#pragma once
class Shadow : public RenderTarget
{
struct ShadowDesc
{
int ShadowQuality = 0;
float ShadowBias = 0.00325f;
Vector2 Size = Vector2(0.1f, 0.1f);
}desc;
static ID3D11Buffer* shadowPSBuffer;
static ID3D11Buffer* shadowVSBuffer;
Camera* cam;
float textureSize;
public:
float range;
static void CreateStaticMember();
static void DeleteStaticMember();
Shadow();
~Shadow();
void SetTarget(Vector3 target);
void SetRGBTexture(int slot);
void ResizeScreen(float width, float height);
void RenderDetail();
};
#include "framework.h"
ID3D11Buffer* Shadow::shadowPSBuffer = nullptr;
ID3D11Buffer* Shadow::shadowVSBuffer = nullptr;
void Shadow::CreateStaticMember()
{
{
D3D11_BUFFER_DESC desc = { 0 };
desc.ByteWidth = sizeof(ShadowDesc);
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, &shadowPSBuffer);
assert(SUCCEEDED(hr));
}
{
D3D11_BUFFER_DESC desc = { 0 };
desc.ByteWidth = sizeof(Matrix);
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, &shadowVSBuffer);
assert(SUCCEEDED(hr));
}
}
void Shadow::DeleteStaticMember()
{
SafeRelease(shadowVSBuffer);
SafeRelease(shadowPSBuffer);
}
Shadow::Shadow()
: textureSize(500.0f), range(200.0f), RenderTarget(500.0f, 500.0f)
{
cam = Camera::Create();
cam->viewport.width = textureSize;
cam->viewport.height = textureSize;
desc.Size.x = textureSize;
desc.Size.y = textureSize;
}
Shadow::~Shadow()
{
SafeRelease(cam);
}
void Shadow::SetTarget(Vector3 target)
{
Vector3 up = Vector3(0, 1, 0);
Vector3 direction(LIGHT->dirLight.direction.x, LIGHT->dirLight.direction.y, LIGHT->dirLight.direction.z);
direction.Normalize();
Vector3 pos = target + (-direction * range);
cam->view = Matrix::CreateLookAt(pos, target, up);
Vector3 origin = Vector3::Transform(target, cam->view);
float n = origin.z - range * 0.5f;
float f = origin.z + range * 0.5f;
cam->proj = Matrix::CreateOrthographic(range, range, n, f);
cam->viewport.width = textureSize;
cam->viewport.height = textureSize;
cam->SetShadow();
RenderTarget::SetTarget(Color(1, 1, 1, 1));
}
void Shadow::SetRGBTexture(int slot)
{
D3D->GetDC()->PSSetShaderResources(7, 1, &rgbResource);
{
Matrix TVP = cam->view * cam->proj;
TVP = TVP.Transpose();
D3D11_MAPPED_SUBRESOURCE mappedResource3;
D3D->GetDC()->Map(shadowVSBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource3);
memcpy_s(mappedResource3.pData, sizeof(Matrix), &TVP, sizeof(Matrix));
D3D->GetDC()->Unmap(shadowVSBuffer, 0);
D3D->GetDC()->VSSetConstantBuffers(5, 1, &shadowVSBuffer);
}
{
D3D11_MAPPED_SUBRESOURCE mappedResource;
D3D->GetDC()->Map(shadowPSBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
memcpy_s(mappedResource.pData, sizeof(ShadowDesc), &desc, sizeof(ShadowDesc));
D3D->GetDC()->Unmap(shadowPSBuffer, 0);
D3D->GetDC()->PSSetConstantBuffers(5, 1, &shadowPSBuffer);
}
}
void Shadow::ResizeScreen(float width, float height)
{
RenderTarget::ResizeScreen(textureSize, textureSize);
this->textureSize = textureSize;
desc.Size.x = textureSize;
desc.Size.y = textureSize;
}
void Shadow::RenderDetail()
{
ImGui::SliderFloat("Range", &range, 1, 2000);
if (ImGui::SliderFloat("textureSize", &textureSize, 1, 2000))
{
ResizeScreen(textureSize, textureSize);
}
ImGui::SliderFloat("ShadowBias", &desc.ShadowBias, -0.1f, 0.1f);
ImGui::SliderInt("Quality", &desc.ShadowQuality, 0, 1);
ImVec2 size(400, 400);
ImGui::Image((void*)rgbResource, size);
}
읽어주셔서 감사합니다.
Comments