응애맘마조

230912 강의 본문

공부/3D강의

230912 강의

TH.Wert 2023. 9. 12. 20:21

그림자 매핑을 강의했습니다.

#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);
}

 

범위나 텍스쳐 사이즈에 따라 품질의 변화가 생기는 그림자

읽어주셔서 감사합니다.

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

230914 강의  (0) 2023.09.14
230913 강의  (0) 2023.09.13
230911 강의  (0) 2023.09.11
230908 강의  (0) 2023.09.08
230907 강의  (0) 2023.09.07
Comments